Клиент чата - сокет и сокет сервера одновременно

Итак, для проекта я создаю небольшой одноранговый клиент чата для двух человек, использующий Java в среде IDE Netbeans.

Мой вопрос не совсем в коде, а больше о структуре и способах реализации.

Я хочу, чтобы клиент был открыт и ServerSocket прослушивал любые соединения, которые пытаются установить от другого клиента, использующего Socket (этот другой клиент также должен иметь ServerSocket). Итак, идея состоит в том, что оба клиента имеют возможность принять соединение после открытия клиента и возможность попытаться установить соединение.

В любом случае, проблема в том, что ServerSocket.Accept(); блокирует (правильная терминология?) Программу после ее вызова до истечения тайм-аута. Я хочу, чтобы ServerSocket просто слушал в фоновом режиме любые входящие соединения и подключал их, если это так, без полного отключения функции программы (то есть, чтобы пользователь мог сам инициировать соединение), пока это происходит? Для этого мне нужно создать отдельный поток для ServerSocket, который будет уничтожен после установления соединения?

Кроме того, после установления соединения, как мне заставить программу периодически проверять входной поток Socket, чтобы видеть, есть ли какие-либо входящие сообщения от другого клиента?

Есть ли способ добиться этого в одном потоке? (Я еще не особо углублялся в темы)

Прошу прощения, если это немного расширительно.

Огромное спасибо!!


person jackgerrits    schedule 18.06.2013    source источник
comment
Не бойтесь использовать несколько потоков. Как только вы что-то сделаете с Swing или AWT, у вас все равно будет несколько потоков. Так что не убегайте от ниток - попробуйте их приручить ...   -  person mschenk74    schedule 18.06.2013
comment
Не могли бы вы указать мне где-нибудь, где объясняются темы? Я думаю, что это лучший способ делать здесь то, что я хочу.   -  person jackgerrits    schedule 18.06.2013
comment
Учебники, которые я использовал для обучения в 1997 году, больше не доступны в Интернете. Придется снова поискать в Интернете. Страницы Анжелики Лангер, а также страницы Ларса Фогеля - хорошее начало для поиска хорошей информации и руководств по Java.   -  person mschenk74    schedule 18.06.2013


Ответы (1)


ServerSocket блокирует и все.

Но если вам нужна только одноранговая связь между двумя подключенными сторонами и ничего более, такое поведение не является проблемой. Вам просто понадобятся две программы: серверная и клиентская. Сервер блокируется до тех пор, пока он не получит соединение от клиента, и клиентские блоки, пока он не получит соединение.

Если вы хотите реализовать Java IO в однопоточном режиме, вам следует использовать Java Nio. В Интернете есть множество руководств по этому поводу. Например, http://tutorials.jenkov.com/java-nio/server-socket-channel.html.

Также кажется, что вы не очень знакомы с сетями и сокетами, поэтому может быть полезно использовать какой-то слой вместо сырых сокетов.

Возможно, вам стоит рассмотреть JeroMQ (https://github.com/zeromq/jeromq) для реализации связи между программами. .

person Panu    schedule 18.06.2013
comment
Кроме того, что такое JeroMQ, я не могу найти нигде, что объясняет это. - person jackgerrits; 18.06.2013
comment
На уровне программирования есть абстракция, которая скрывает детали реализации низкого уровня и, возможно, предлагает некоторые дополнительные функции. В этом случае, если вам нужен только рабочий одноранговый чат, может быть проще использовать некоторую высокоуровневую библиотеку вместо использования сырых сокетов. - person Panu; 18.06.2013
comment
JeroMQ - это чистая java-реализация ZeroMQ (zguide.zeromq.org/page:all). Цель ZeroMQ - обеспечить более высокий уровень абстракции связи, чем это делают необработанные сокеты. - person Panu; 18.06.2013
comment
Хм, ладно, так SocketChannels от NIO? Или что-то подобное? Это то, о чем вы имели в виду? Или есть другой, который я мог бы использовать? - person jackgerrits; 18.06.2013
comment
да. Если вы хотите научиться эффективному низкоуровневому общению с использованием Java, тогда вам подойдет SocketChannels & co. - person Panu; 18.06.2013
comment
Спасибо за вашу помощь, я изучу JeroMQ и многопоточность. - person jackgerrits; 18.06.2013