| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Многопоточное взаимодействие в лобби-чат сервере |
| Автор: Tipon 4.4.2010, 19:54 |
| Недавно начал изучать Яву. До этого было не много простых Pascal / ActionScript / JavaScript -программ. Написал по книжке многопоточный Эхо-сервер (каждый клиент - отдельный сокет получает в ответ свое же сообщение с добавкой "Эхо" ) - вроде разобрался. Задача: написать программу Лобби-сервер с функцией чата для конкретной онлайн игры. Проблема:(в синхронизации) предсказуемой последовательности обращения потоков на чтение\запись в массив. Описание: Известный мне метод synchronized не совсем подходит, т.к. после разблокировки объекта блокировку перехватывает рандомный в очереди поток, что иногда приводит к устареванию данных и уже неактуальности их отправки клиенту. Читал не много и про другие методы синхронизации, мне показались они неоправданно сложны и не совсем понятно какой вообще метод разделения доступа лучше всего использовать, чтобы и производительность была на высоком уровне и и код был более-менее красивым и простом в решении этой проблемы. |
| Автор: Sleepy_PIP 4.4.2010, 20:05 |
| 1000 потоков. это критика. в смысле это не правильно. сокетов может быть хоть лимон хотя Вам столько ОС не даст не дело вешать по потоку на каждый сокет при Ваших условиях .... поток на запрос - пожалуста - чем-бы запрос не являлся и пул сокетов для вашего случая ... про синхронизацию - есть несколько методов , не только 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 почитайте исходники, их не много, может быть вдохновит. |