Программирование на сокете -Java - Многие клиенты Один вопрос на сокете - PullRequest
3 голосов
/ 12 ноября 2009

По сути, я пытаюсь подключить многие многие Java-клиенты к сокету на моем сервере ColdFusion (используя Socket Gateway). Однако, прежде чем я даже начну кодировать это, я немного озадачен сокетами и их производительностью. Прежде всего, предназначены ли сокеты для многих (более 1000) клиентов, подключающихся к одному сокету (скажем, порт 2202) на одном сервере? Какова производительность, если все, что там ожидает, это в основном пинг или что-то такое, что, когда эти клиенты получают этот «пинг», они могут получить новые данные.

Спасибо, Фейсал Абид

Ответы [ 4 ]

6 голосов
/ 12 ноября 2009

Сокет идентифицируется следующим кортежем,

  1. IP-адрес источника
  2. Исходный порт
  3. Dest IP
  4. Порт назначения
  5. Протокол (TCP или UDP)

Даже 1000 клиентов подключаются к одному и тому же порту (Dest Port), каждый из них получит свой собственный сокет. Таким образом, у вас будет 1000 открытых розеток.

Будет сложно поддерживать 1000 сокетов с блокирующим вводом / выводом, что обычно означает 1000 потоков. Вам нужно использовать NIO. У нас есть сервер, написанный на Mina , который может обрабатывать 2000 соединений в пике.

2 голосов
/ 12 ноября 2009

Прежде всего, розетки предназначены для многие (более 1000) клиентов подключаются к одному сокет (скажем, порт 2202) на одном сервере

Да, ваш сервер откроет сокет на порту 2202, и к нему подключится 1000 клиентов. Сервер откроет сокет сервера, а клиент откроет сокет клиента, он другой.

Как производительность, если все есть ожидание в основном пинг, или что-то такое, что когда эти клиенты получить этот "пинг", они могут пойти получить некоторые новые данные

На сервере вы используете функцию getInputStream для получения данных от клиента и функцию getOutputStream для отправки данных клиенту.

Примечание: вы должны использовать Thread для обработки каждого запроса клиента

1 голос
/ 12 ноября 2009

Нет ничего плохого во многих клиентах сокетов, которые используют блокирующий ввод / вывод (вы можете посмотреть эту статью для получения дополнительной информации об этом). Однако есть и другие подходы, которые могут лучше соответствовать вашим потребностям:

0 голосов
/ 16 апреля 2010

Привет соединение с 1000 клиентами одновременно с использованием простого программирования Java-сокетов - не идеальный способ. Проблема в том, что в Fedora Linux по умолчанию максимальный размер файла, который можно открыть, составляет 1024, а в Windows - 2048 или что-то в этом роде. Таким образом, на вашей стороне сервера вы найдете более 1000 открытых файлов, и после этого, если клиент продолжит увеличиваться, вы обнаружите, что слишком много файлов обнаружили ошибку. так что лучший способ - использовать неблокирующее программирование сокетов (я имею в виду использование SocketChannel). Используя сокет-канал одновременно, как я проверил, мы можем без проблем подключиться к 20 000 клиентов.

Так что лучше используйте nio. есть очень хорошая книга из издания Oreilly для java nio. Я использовал Java Java (сокет канал)

Спасибо Сунил Кумар Саху

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...