2014-12-11 3 views
0

Я пишу игровой сервер в Java. Как обычно в игровых серверах, я должен принимать данные, полученные одним клиентом, и распространять их по комнате клиента (другие клиенты). В настоящее время каждый клиент создает собственный поток и работает поверх этого. Однако у меня возникают проблемы с определением отношений между игроками. Как мне управлять чем-то вроде чата, где сообщение должно быть отправлено всем другим игрокам в одной комнате? Я думаю о чем-то вроде очереди сообщений, где все потоки будут часто искать сообщения и отправлять их своему собственному клиенту.Многопоточный сервер Java

Я также открыт для предложений, которые могут прерывать многопоточность сразу, но я не знаком с NIO, и сервер уже написан с использованием простых Socket s и Thread s.

Резюме: Как заставить моих клиентов (в потоках) разговаривать друг с другом? Или есть лучшая альтернатива не-резьба?

+0

Использование некоторых фреймворков, таких как Netty, сделает вашу жизнь намного проще, а ваше приложение станет более масштабируемым. Я уверен, что передача данных подключенным клиентам становится простой задачей. Возможно, будет небольшая кривая обучения, но она того стоит. –

+0

@JurgenCamilleri Я ахнул, когда я прочитал инструкцию по началу работы для netty! Так много «строителей» и «фабрик» заставляют меня плакать! знаете ли вы о лучшем ресурсе для его изучения или о том, что это истинный и проверенный способ? –

+0

В моем опыте с Netty я только начал писать примеры и пробовать их сам; затем начал строить поверх них то, что мне было нужно, и отбросил то, чего я не сделал. Этот канал YouTube содержит ряд, который выглядит многообещающим: https://www.youtube.com/channel/UCIA0yteJXa5JgRqxFJYQbEQ –

ответ

1

Один из подходов, который я использовал, - это создать класс сервера и класс, который расширяет Thread.

Класс сервера будет порождать все ваши потоки и сохранять список всех текущих запущенных потоков, которые он создал.

В вашем классе Thread используйте объект Socket для создания потоков ввода/вывода. Когда в одном из этих потоков есть что сказать, он будет разговаривать с сервером через поток, а затем сервер доставляет это сообщение всем своим текущим потокам.

Это действительно простой учебник по Java, который мне очень помог.

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

+0

Ой, поэтому сервер в отдельном потоке слушает для клиентов каждый в своих потоках? Разве это не приведет к задержке между письмом клиента и сервером, получающим его? –

+0

уверен, всегда есть какая-то задержка. но сколько вы ожидаете от задержки? – Jakeway

+0

На самом деле это звучит сейчас. Единственное задание главного потока - следить за тем, чтобы потоки клиентов запрашивали трансляцию и прочее. Звучит аккуратно, я могу попробовать, если netty не работает со мной. Спасибо! –

-1

Эй я сделал библиотеку только для этого! https://www.dropbox.com/s/xcy1uyyyc610lb5/JSock.rar?dl=0 Просто скачайте его и импортируйте в свой проект. Читайте ReadMe.txt, это объяснит большую часть материала. Если вам нужно, чтобы я объяснил больше, просто спросите!

+1

Включите соответствующие части ссылки в свой ответ, чтобы продемонстрировать примеры кода. В настоящее время этот ответ очень спам, особенно связанный с DropBox .rar ... Почему бы не использовать GitHub для совместного использования? Кажется более законным. – CubeJockey

1

Мое предлагаемое решение тоже похоже на Jakeway. Таким образом, я точно реализовал одну и ту же функцию.

Сервер создает один поток и создать сокет сервера в этом потоке и ожидает подключения

клиент будет подключаться к серверу. Сервер создаст ClinetSocket и передаст этот сокет в поток. Этот поток отвечает за клиент/сервер связи с сервера

формой на стороне клиента, при создании сокета, один поток будет начать и что поток отвечает за клиент/сервер связи от клиента

Посмотри некоторые из готовых кодов ниже ссылок.

chat example 1

chat example 2

Относительно Pros & минусы использования сокетов, посетите ниже ссылке: rmi vs servlets vs sockets

Что касается клиентов связи между ними? Невозможно.Клиент отправит сообщение серверу & серверу следует отправить сообщение другому клиенту. Если вы посмотрите на Yahoo вид чат

1) Вы отправить сообщение на сервер в чате

2) Сервер есть список клиентов подписался клиентов в чат

3) Сервер будет отправлять сообщение всем клиентам, подписанным на номер

Смежные вопросы