Многопоточная серверная программа на Java - PullRequest
5 голосов
/ 01 декабря 2011

Я пытаюсь написать многопоточную программу на Java, где сервер прослушивает соединения от клиентов и создает поток для размещения каждого клиента.У меня есть:

while(true)
    {
        Socket s = server.accept();    
        ClientHandler ch = new ClientHandler(s);
        Thread t = new Thread(ch);
        t.start();  
    }

Мой вопрос: всякий раз, когда он принимает соединение в

Socket s = server.accept();

и начинает выполнять следующие строки кода для создания потока и т. Д., Что происходит сзапрос на подключение от клиента в течение этого времени.Это каким-то образом поставлено в очередь и будет обработано в следующем цикле while(true) или будет отклонено?

спасибо, Никос

Ответы [ 4 ]

4 голосов
/ 01 декабря 2011

После возврата accept() TCP-рукопожатие завершено, и у вас есть подключенный клиентский сокет (s в вашем коде). До следующего вызова accept() ОС ставит в очередь ожидающие запросы соединения.

Возможно, вы захотите проверить какое-нибудь учебное пособие, например , например, .

1 голос
/ 01 октября 2012

Я написал крошечный http-сервер на Java, который вы можете найти на github. Это может быть хорошим примером для вас, чтобы взглянуть на реальное использование сокетов и многопоточности.

0 голосов
/ 25 октября 2012

тьфу :)

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

когда вы «слушаете» ServerSocket, вы указываете, что один из ответов говорит «Nusers», но это так - размер «отставания», который должен хранить сокет. в этом журнале ожидания ожидающие соединения сохраняются, и, если он заполнен, все остальные (должны) получить ConnectionRefused.

Итак

а) увеличить, когда вы медленно принимаете (server.accept ()) соединения

b) быстрее принимать соединения,

b.1) использование ThreadPool (с удовольствием перенесите проблему в контекстные переключатели операционной системы)

b.2) использовать NIO, а также способность обрабатывать состояния сокетов в отдельных потоках / процессорах (если внутренняя пропускная способность данных выше, чем в сети, это более производительный вариант)

веселись

0 голосов
/ 26 сентября 2012

Как уже было сказано: да, он ставится в очередь, и нет, он не отклоняется.

Я думаю, что любой, кто читает этот вопрос, должен сначала знать, что при создании экземпляра сокета:

server = new ServerSocket(mPort, mNusers);

Java уже реализует сетевой сокет ;который имеет четко определенное поведение.Однако соединение будет отклонено после достижения установленного предела.

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

ClientHandler[] ch = new ClientHandler[mNusers];
int chIndex = 0;
while(true)
    {
        Socket s = server.accept();    
        ch[chIndex] = new ClientHandler(s);
        Thread t = new Thread(ch);
        t.start(); 
        chIndex++;
    }

Массив может быть не лучшим вариантом, но я хочу отметить, что с сокетами вы должны знать, какой предел соединений вы будете выделять

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