(Новое в многопоточности) Лучший способ структурировать приложение для обмена мгновенными сообщениями? - PullRequest
2 голосов
/ 07 марта 2011

Я некоторое время программировал на Java, но никогда раньше не работал с потоками.На одном из моих занятий мы узнали о простых в использовании, но при этом чрезвычайно мощных классах Socket и ServerSocket.Мы создали программы, которые могли общаться друг с другом на одной машине (используя «localhost»).Было два класса, Server.java и Client.java, но они могли общаться друг с другом только пошагово.

Я хотел бы добавить метод socket.accept() на новыйпоток, так что программы сервера и клиента могут отправлять сообщения, пока socket.accept() ожидает новых сообщений.

Пока что у меня все хорошо с потоками, но я не могу понять, куда поместить ServerSocket / Socketобъекты.Если я помещу их в поток, ожидающий входящие сообщения, я не смогу использовать этот объект для исходящих сообщений.Если я помещу объекты ServerSocket / Socket непосредственно в файл Server.java/Client.java, я не смогу (или просто не знаю, как) передать объект в поток без создания его копии.

Любые предложения о том, как я должен структурировать эту программу?

Спасибо, Дерек

1 Ответ

1 голос
/ 07 марта 2011

Я бы сказал, что лучший способ запустить это приложение - это два отдельных процесса / виртуальных машины, а не два потока. Хотя вы в данный момент запускаете их на одной (виртуальной) машине, весь смысл обмена мгновенными сообщениями - и сокетов - состоит в том, чтобы обеспечить связь между различными процессами, которые могут быть на разных машинах. У вас уже есть два класса - просто убедитесь, что у обоих есть main() методы, чтобы они могли работать самостоятельно.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...