【问题标题】:SocketServer keeps accepting same connection. Creating multiple threads for that same connectionSocketServer 不断接受相同的连接。为同一个连接创建多个线程
【发布时间】:2015-10-17 19:57:34
【问题描述】:

我正在创建一个简单的 http 服务器。我有一个主线程循环等待连接被接受。一旦连接被接受,我创建一个新的工作线程来处理连接,将接受的套接字作为参数传递。一旦连接被接受,就会为其创建一个新线程,但是主线程将再次循环,创建另一个具有相同连接的套接字并创建另一个重复线程。

主线程等待连接。

public void run(){
    while(Tester.serverStatus != "quit"){
    try {
        Socket clientSocket = serverSocket.accept();
        new Thread(new Worker(clientSocket)).start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
    try {
        this.stop();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return;
}

public void stop() throws IOException{
    serverSocket.close();
    return;

}

工作线程伪代码

            public void run(){
InputStream input = clientSocket.getInputStream();
//read from stream, validate request and setup the response in a byte array
input.close();

DataOutputStream output = new DataOutputStream(clientSocket.getOutputStream());
output.write(responseByteArray);
output.flush();
output.close();

clientSocket.close();
return;


}

关于为什么在接受第一个连接后没有阻止 accept() 方法的任何想法?它只是继续使用相同的 Socket 创建重复的 Worker 线程。

谢谢

【问题讨论】:

  • 实际上不可能使用套接字 API 创建完全重复的连接。您确定您没有围绕connect 呼叫在客户端上旋转吗?使用netstat 检查连接源端口号。

标签: java multithreading sockets


【解决方案1】:

你描述的不可能。

毫无疑问,您在某处有一些静态变量应该是 Worker, 的实例成员,例如输入和/或输出流,和/或套接字本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2018-07-19
    • 1970-01-01
    • 2012-12-10
    • 2013-07-07
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多