Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Многопоточное взаимодействие в лобби-чат сервере


Автор: Tipon 4.4.2010, 19:54
Недавно начал изучать Яву. До этого было не много простых Pascal / ActionScript / JavaScript  -программ.

Написал по книжке многопоточный Эхо-сервер (каждый клиент - отдельный сокет получает в ответ свое же сообщение с добавкой "Эхо" ) - вроде разобрался.

Задача:  написать программу Лобби-сервер с функцией чата для конкретной онлайн игры.

Проблема:(в  синхронизации) предсказуемой последовательности обращения потоков на чтение\запись в массив.

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



Автор: Sleepy_PIP 4.4.2010, 20:05
1000 потоков. это критика. в смысле это не правильно. сокетов может быть хоть лимон хотя Вам столько ОС не даст smile но все равно моежт быть более 1000. но потоков более 1000 на 1 задачу держать все равно очень плохо. во всех ОС кроме майнфреймов. но там даже не потоки. сорри если помешал ... 
не дело вешать по потоку на каждый сокет при Ваших условиях .... поток на запрос - пожалуста - чем-бы запрос не являлся и пул сокетов для вашего случая ... про синхронизацию - есть несколько методов , не только synchronise метода.
Вам надо что - что-б данные не устарели для конкретного соединения или для любого?. для конкретного - очереди. для любого - сорри - это скорее даже просто к каналу и серверу ... 
как быстрее - общяя очедедь сообщений, подписчики на сообщения. пул коннектов, пул потоков. все ИМХО ...

Автор: Tipon 4.4.2010, 20:31
1000 это скорее образно говоря, я зря ляпнул это в описании. На практике скорее всего 300-600 клиентов онлайн, которым надо принять и передать все изменения в лобби-таблице и в чате для каждого. 

Не суть важно с какой задержкой, главное чтобы все произошедшие на сервере изменения дошли до конечного клиента в такой же очередности. То, что можно не использовать для каждого сокет-соединения свой поток - это для меня новое(спасибо). Но конечно, пока для меня все это очень смутно и не до конца понятно. Я понимаю что все надо организовать через очереди запросов-действий, но как это реализовать пока не ясно.

Спасибо и на том, что уже открыли для меня, но, извиняюсь если наглею, если есть какие-то более конкретные ссылки, примеры, то я буду вообще безмерно счастлив.

Автор: jk1 4.4.2010, 22:00
Есть открытая реализация похожей задачи
http://www.dwgold.com/Projects/Networking/Chatserver/Default.aspx
почитайте исходники, их не много, может быть вдохновит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)