Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > ServerSocket+многопоточность


Автор: esi 28.5.2009, 12:04
Помогите разобраться с многопоточностью ServerSocket. Создаю serverSocket, для каждого клиента создаю отдельный поток и имитирую задержку ответа в 3 секунды. Запускаю сервер, открываю 3 окна браузера и из каждого одновременно отправляю запрос на сервер. Тем не менее, ответы не приходят одновременно, а последовательно. В чем может быть причина? (вместо sleep пробовал длинный for, результат такой-же) Как можно реализовать такую ситуацию, чтобы запросы действительно обрабатывались параллельно?
 
Код

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

public class BoringServer {
    public static void main(String [] args) {
        try {
            ServerSocket srvSock = new ServerSocket(5555);
            while(true) {
                Socket connection = srvSock.accept();
                (new Worker(connection)).start();
            }
        }catch(IOException e) {e.printStackTrace();}
    }
}

class Worker extends Thread {
    Socket sock = null;
    Worker(Socket s) {
        sock = s;
    }
    
    public void run() {
        try
        {
            System.out.println("accepted");
            try    {
                Thread.sleep(3000);
            }catch (InterruptedException e)    {e.printStackTrace();}
            System.out.println("closed");
            sock.close();
        }catch (IOException e) {e.printStackTrace();}
    }
}



Автор: COVD 28.5.2009, 13:11
ваш сервер принимает запросы последовательно (accept() в одном потоке), а обработка запросов (в вашем случае это sleep ) происходит параллельно ( в разных потоках). Если вы установите случайное время (а не 3 сек всем) обработки для каждого запроса, то обнаружите, что ответы на некоторые поздние запросы возвращаются раньше, чем на более ранние. Это и будет подтверждением параллельности обработки.

Автор: esi 28.5.2009, 14:00
попробовал установить случайное время для обработки запросов - результат такой-же, с той разницей, что при одновременной отправке 3 запросов в первом случае ответ приходил через 3,6,9 секунд соответственно, при случайном времени обработки - не так равномерно, но суть не меняется, поскольку на сервере сообщения "accepted" и "closed" выводятся строго последовательно независимо от равномерности поступления запроса и порядок прихода ответов не меняется. 

Можно ли как-нибудь принимать accept()  не последовательно, а параллельно с использованием одного порта?

Автор: esi 28.5.2009, 17:34
при переделывании на UDP (DatagramSocket) работает без проблем, похоже, проблема именно в TCP. Пробовал создавать несколько потоков и в каждом из них вызывать accept - результат такой-же - запросы обрабатываются все равно последовательно. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)