Как установить несколько потоков ввода-вывода между клиентом и сервером?

#java #sockets #io

#java #сокеты #io

Вопрос:

Я создаю пару клиент / сервер на Java, которая на данный момент поддерживает только чересстрочную текстовую связь с помощью средств записи и буферизации, обернутых вокруг потоков ввода-вывода как сервера, так и клиента.

Я хотел бы реализовать функцию, которая использует поток Image[Input / Output] для отправки BufferedImage с сервера клиенту с заданным интервалом.

Проблема в том, что я хочу, чтобы BufferedImages отправлялись / принимались в отдельных потоках, чтобы клиент / сервер все еще мог отправлять / получать текстовые команды.

Могу ли я создать несколько потоков или сокетов? Если да, то это лучший способ?

Комментарии:

1. Вы можете создать несколько сокетов, просто откройте дополнительные так же, как вы создали свой первый (однако вы не можете иметь несколько сокетов, открытых для одной и той же комбинации ip / port, поэтому выберите другой порт).

2. Спасибо. Я подумал, что мне, возможно, придется идти в этом направлении. Нет ли способа сделать это только с 1 портом? Возможно, я захочу реализовать другие функции, которые должны выполняться одновременно… Нормально ли для приложений открывать так много портов?

3. Для приложений вполне нормально открывать много портов, но конечным пользователям, очевидно, лучше придерживаться одного. Единственным другим вариантом является мультиплексирование данных через ваш единственный сокет, как описано Jarrod.

4. Не используйте PrintWriter по сети. Он проглатывает исключения, о которых вам нужно знать. В этом случае вы могли бы использовать BufferedWriter .

Ответ №1:

Одним из способов добиться этого с помощью одного сокета является мультиплексирование отдельных потоков через один байтовый поток, подключенный к сокету, хорошей реализацией этого является BEEP.

Ответ №2:

Да, конечно, вы можете создать столько потоков и сокетов, сколько вам нужно. Только будьте осторожны: не забудьте закрыть сокеты и контролировать процесс создания потоков: слишком много потоков не улучшают вашу производительность и могут даже привести к остановке вашей системы.

Вероятно, вам следует использовать пул потоков. Но это зависит от вашего приложения. Взгляните на java.util.concurrency package .

Если у вас есть более конкретные вопросы, не стесняйтесь задавать их.

Ответ №3:

Поток мультиплексирования должен поддерживать несколько буферов.

Считывателю должен быть предоставлен собственный буфер с помощью потока мультиплексирования. Поток мультиплексирования должен увеличивать каждый буфер во время операции записи и уменьшать требуемый буфер во время операции чтения.

Одним буфером перемотки сложнее управлять, поскольку считыватели должны быть с отслеживанием состояния, но, как правило, он более масштабируемый, если не производительный.

Конкретный используемый протокол подключения является деталью реализации. Сетевые сокеты — это просто буферы, и их можно использовать для реализации мультиплексирующего потока. В этом случае сеть становится узким местом.