Java Socket Server, который обслуживает клиентов поочередно - PullRequest
1 голос
/ 16 января 2010

Есть ли способ реализовать сервер сокетов, который обслуживает клиентов поочередно.
Как правило, практика заключается в отправке подключенных клиентов в новый поток, который обслуживает запросы и ответы, но не более одного потока на клиента на стороне сервера.

Я не хочу этого делать, потому что позже я хочу портировать это приложение на Java ME, у которого может быть ограничение на количество одновременных потоков, запущенных в определенный момент времени.

Мне было интересно, как решить эту проблему?

Ответы [ 5 ]

4 голосов
/ 16 января 2010

Конечно, просто не запускайте фоновый поток для обработки клиента.

РЕДАКТИРОВАТЬ

Похоже, что вы действительно хотите для большого числаклиентов, чтобы иметь возможность подключаться, но не создавать нагрузку потоков.Поскольку NIO не поддерживается, как насчет использования двух потоков:

  • Один поток зацикливает принятие соединений, передавая подключенный Socket во второй поток, который просто добавляет его в список подключенных сокетов(это необходимо синхронизировать)
  • Второй поток, который просматривает свой внутренний список активных соединений и по очереди "работает" с каждым из них.

Вызов socket.setSoTimeout()с достаточно малым значением должно препятствовать тому, чтобы второй поток ожидал слишком долго на одном соединении.

1 голос
/ 16 января 2010

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

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

1 голос
/ 16 января 2010

Вы можете использовать неблокирующие розетки. Если вы сделаете это, вам не нужен поток для каждого клиента. Java уже некоторое время поддерживает это через NIO . Я не уверен, что это поддерживается Java ME. Java ME растет в наши дни так, что включает в себя многие функции JSE. Вероятно, немного необычно, что у вас есть серверная функциональность в среде Java ME, которая должна обслуживать множество клиентских соединений.

В вашей ситуации трафик все еще не маршрутизируется через сервер? Если это так, то нет причин, по которым среда J2ME не может получать сообщения от многих других клиентов или партнеров (если вы хотите их так называть) через соединение с одним сокетом на сервере.

1 голос
/ 16 января 2010

Обычно обработка сервера выглядит примерно так:

    ServerSocket s;
    Socket newSocket;
    while (newSocket = s.accept()) {
        new SocketHandlingThread(newSocket).start();
    }

где SocketHandlingThread () - это класс, который вы создали для выполнения любой серверной части диалога сокетов.

Есть два основных способа сделать то, что вы просите (это обрабатывать сокеты синхронно ). Во-первых, нужно просто присоединиться к потоку обработчика, прежде чем снова вернуться к accept (), как это

    while (newSocket = s.accept()) {
        SocketHandlingThread thread = new SocketHandlingThread(newSocket);
        thread.start();
        thread.join();
    }

Как указано в комментариях ниже, вы можете избежать объединения, просто вызвав метод run потока, например

 thread.run(); 

вместо звонков начала и присоединения.

Другой метод - взять любой код в методе выполнения SocketHandlingThread и напрямую переместить его в цикл.

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

Вы можете установить SO_TIMEOUT на принимающем сокете. Это заставит принять вызов, чтобы быть неблокирующим. Таким образом, вы можете подождать немного времени, затем обслуживать одно из ранее принятых соединений, затем вернуться к принятию новых и так далее, и так далее. Код будет выглядеть примерно так:

do(
  try{
    socket.setSoTimeout(200);
    Socket connected = socket.accept()
  } catch (SocketTimeoutException e){//just ignore}
  //handle your other threads/connections here
} while (!shutDown)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...