Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > По какому принципу строятся многопоточные серверы?


Автор: acinonyx 25.3.2009, 23:08
Как строятся сервера для многиг клиентов?
Насколько я понимаю протокол TCP-IP позволяет подключить на один порт только одного клиента.
Соединение нужно поддерживать, по етому насколько я понимаю DatagramSocket не подходит.

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

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

Интересует подход вобще, и в Java вчастности.

Автор: jManiak 26.3.2009, 14:31
http://forum.sources.ru/index.php?showtopic=217611 когда-то создавал подобную тему.

А если в общем, то я делал так: клиент конектится. Создается новый Socket для него, в отдельном потоке, в этом сокете находятся как ип и порт отправителя так и получателя. через этот Сокет уже и работаете с клиентом. А ServerSocket создается один.

Автор: idti 26.3.2009, 21:47
Клиенты могут подключаться на один порт по умолчанию до 50 клиентов. Это я про java. Прочитать про это можно например у Шилда, полный справочник по java 6.0. Чтобы реализовать это нужно создать СокетСервер и асептить клиентов, каждый такой клиент создает уже рабочий Сокет.

Автор: acinonyx 30.3.2009, 02:23
Спасибо

Автор: nucer 29.4.2009, 23:21
Цитата
Я сделал так: клиент подключается к ServerSocket-y по некоторому порту, после чего создается новый ServerSocket (с новым портом), а  клиенту передается новий порт на который он должен переподключиться для дальнейшей роботы. Таким образом каждый клиент коннектится на один и тот же порт но дальше работа идет у каждого со своим.

ServerSocket - это открытый сервером на прослушку порт т.е. туда конектятся клиенты, с ним ничего делать не надо, он один. Дальше каждому клиентскому конекту присваивается Socket - для каждого клиента свой, на отдельном порту. винда позволяет открыть до 65535 портов в идеале насколько я знаю.

Цитата
интересно как же тогда работают, к примеру, игровые сервера с которыми постоянно соединены тисячи клиентов? неужели они выделяют каждому свой порт?

Интересует подход вобще, и в Java вчастности.
копался в l2j некоторое время назад - именно так все и реализовано, по-другому и не сделать вроде )
Проблема может возникнуть только если это соединения не постоянные, а как в web-сервере - один запрос = один конект, тогда может возникнуть ситуация что портов у системы не хватит и надо заводить какую то очередь, это уже сложно! ) Но с игровыми серверами, которые держат постоянный коннект с клиентом такой проблемы не возникнет 99.9%

Автор: COVD 30.4.2009, 00:01
Цитата

Клиенты могут подключаться на один порт по умолчанию до 50 клиентов. Это я про java. Прочитать про это можно например у Шилда, полный справочник по java 6.0.

А вы не ошиблись? Не могли бы цитату или ссылку привести. Про ограничение в 50 клиентов. 

Автор: Vurn 3.5.2009, 17:32
Цитата(COVD @ 30.4.2009,  00:01)
А вы не ошиблись? Не могли бы цитату или ссылку привести. Про ограничение в 50 клиентов.

Он перепутал. Не количество коннектов 50, а допустимая очередь входящих необработанных коннектов для конструктора по умолчанию 50 входящих.
Код из ServerSocket.java:
Код

    public ServerSocket(int port) throws IOException {
    this(port, 50, null);
    }



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