Java - сервер, который обслуживает каждого клиента в отдельном потоке? - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь настроить свой класс MessageServer таким образом, чтобы он обслуживал каждого клиента в отдельном запросе (вы увидите ниже, что он довольно линейный прямо сейчас)

Как мне это сделать?

import java.net.*;
import java.io.*;

public class MessageServer {

public static final int PORT = 6100;

public static void main(String[] args) {

    Socket client = null;
    ServerSocket sock = null;
    BufferedReader reader = null;

    try {
        sock = new ServerSocket(PORT);
        // now listen for connections
        while (true) {
            client = sock.accept();

            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));

            Message message = new MessageImpl(reader.readLine());

            // set the appropriate character counts
            message.setCounts();

            // now serialize the object and write it to the socket
            ObjectOutputStream soos = new ObjectOutputStream(client.getOutputStream());
            soos.writeObject(message);
            System.out.println("wrote message to the socket");

            client.close();
        }
    }
    catch (IOException ioe) {
            System.err.println(ioe);
    }


}

}

1 Ответ

1 голос
/ 06 марта 2012

Извините, но ваш вопрос не имеет особого смысла.

Если мы используем термин «запрос» обычным образом, клиент отправляет запрос на сервер, а сервер обрабатывает каждый запрос.Для сервера просто не имеет смысла не обслуживать запросы отдельно (в некотором смысле).

Возможно, вы спрашиваете что-то другое.(Вы имеете в виду «обслуживать каждый клиентский запрос в отдельном потоке»?) Что бы вы ни имели в виду, просмотрите вашу терминологию.


Учитывая, что вы говорите о выполнении запросов в разных потоках, затем используйтеExecutorService API - хороший выбор.Используйте класс реализации, который позволяет вам установить верхнюю границу количества рабочих потоков.Если вы этого не сделаете, вы откроете себя для проблем, когда перегрузка приводит к выделению большого количества потоков, что только замедляет работу сервера.(Кроме того, создание новых потоков не дешево. Это стоит их перерабатывать.)

Вам также следует рассмотреть настройку вашего исполнителя так, чтобы у него не было очереди запросов.Вы хотите, чтобы служба executor блокировала поток, который пытается отправить задание, если работника нет в наличии.Пусть операционная система ставит в очередь входящие соединения / запросы на уровне ServerSocket.Если вы ставите запросы в очередь внутри, вы можете столкнуться с ситуацией, когда вы тратите время впустую, обрабатывая запросы, которые на стороне клиента уже истекли / прекратили.

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