我正在尝试使用线程聊天服务器。但我的插座正在关闭,我不知道为什么会这样。
在服务器类中,我创建了一个新的ClientHandler
addHandler(new ClientHandler(this, incoming));
addHandler启动线程并将新的ClientHandler添加到服务器中的ArrayList。 incoming是客户端套接字。
public ClientHandler(Server serverArg, Socket sockArg) {
server = serverArg;
client = sockArg;
System.out.println(client.isClosed());
}
之间没有任何要求
public void run() {
try {
System.out.println(client.isClosed());
in = new Scanner(client.getInputStream());
out = new PrintWriter(client.getOutputStream(), true);
announce();
System.out.println("Waiting for input");
boolean done = false;
while(!done && in.hasNextLine()) {
System.out.println("There is input!");
server.broadcast(clientName + ": " + in.nextLine());
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
当我运行此代码时。这是输出:
false
true
java.net.SocketException: Socket is closed
为什么在创建此类之后立即关闭/在启动它之前?
答案 0 :(得分:1)
在添加处理程序和调用run()方法之间,代码将关闭连接。我建议你在JDK中的close方法中添加一个断点,并查看它的调用位置。或者在添加处理程序后查看代码。
答案 1 :(得分:-1)
您可以使用wireshark或tcpdump等网络嗅探器。
要查明连接是否因服务器端而中断。
我想也许客户端关闭连接。