调用JAVA套接字的次数太多



我正在尝试实现ServerSocket,但我根本不明白为什么如果我关闭连接,代码会被调用3次。这是我的代码:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import static java.lang.System.out;
public class Main {

public static void main(String[] args) throws IOException {
int port = 8080;
ServerSocket serverSocket = new ServerSocket(port);
out.println("Listening ..");
while(true){
Socket socket = serverSocket.accept();
out.println("Connected" + socket.getLocalAddress());
new Thread(new MultiThreadServer(socket)).start();
}
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import static java.lang.System.out;
public class MultiThreadServer implements  Runnable{
Socket clientSocket;
MultiThreadServer(Socket clientSocket){ this.clientSocket = clientSocket;};
@Override
public void run() {
try{
out.println("inside thread");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
String request = bufferedReader.readLine();
out.println("request: " + request);
bufferedReader.close();
this.clientSocket.close(); //Without this line, the code is only called once
}catch(IOException e){
out.println(e);
}
}

}

因此,通过在clientSocket上调用close((方法,将调用内部调用的"while(true("3次,而不调用该方法,则将调用一次。这是WITH socket.close((的日志:

Listening ..
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1

这是日志WITHOUT socket.close((:

Listening ..
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1

更有可能是您的客户端正在等待来自服务器的数据,直到上一个连接关闭后才尝试再次连接。这可以解释你所看到的行为。

如果你有多个并发客户端,一个连接不知道你不会为一个不相关的连接关闭连接。

最新更新