По какому принципу строятся многопоточные серверы?

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

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

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

Интересует подход вобще, и в Java вчастности.
Ответы (6)
ava
jManiak | 26.03.2009, 14:31 #
Вот когда-то создавал подобную тему.

А если в общем, то я делал так: клиент конектится. Создается новый Socket для него, в отдельном потоке, в этом сокете находятся как ип и порт отправителя так и получателя. через этот Сокет уже и работаете с клиентом. А ServerSocket создается один.
ava
idti | 26.03.2009, 21:47 #
Клиенты могут подключаться на один порт по умолчанию до 50 клиентов. Это я про java. Прочитать про это можно например у Шилда, полный справочник по java 6.0. Чтобы реализовать это нужно создать СокетСервер и асептить клиентов, каждый такой клиент создает уже рабочий Сокет.
ava
acinonyx | 30.03.2009, 02:23 #
Спасибо
ava
nucer | 29.04.2009, 23:21 #
Цитата
Я сделал так: клиент подключается к ServerSocket-y по некоторому порту, после чего создается новый ServerSocket (с новым портом), а клиенту передается новий порт на который он должен переподключиться для дальнейшей роботы. Таким образом каждый клиент коннектится на один и тот же порт но дальше работа идет у каждого со своим.

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

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



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


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


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

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

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


Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  nucer   COVD ava  jManiak   Vurn   acinonyx   idti
advanced
Отправить