一旦客户端断开连接并重新启动客户端,服务器就会给出读取线超时。当我再次运行服务器时,它工作正常。因此,在断开连接一次后,我得到读取线超时异常,下次它会工作。
import java.io.*;
public class TcpServer {
ServerSocket welcomeSocket;
public TcpServer() throws IOException{
createSocket(port);
}
public TcpServer(int port) throws IOException{
createSocket(port);
}
private void createSocket(int port) throws IOException{
welcomeSocket = new ServerSocket(port);
}
@Override
public void listen() throws IOException{
boolean exitServer = false;
Socket connectionSocket = null;
try {
while (!exitServer ) {
if(...){
exitServer = true;
}
}
}
} catch (IOException e) {
try {
welcomeSocket.accept();
listen();
} catch (IOException e1) {
System.out.println("Cannot open connection!!!");
}
}
}
}
答案 0 :(得分:1)
当有人尝试连接时,ServerSocket.accept()方法会阻止并返回新的客户端套接字连接。将它放在while循环中,然后为这个新的socket worker生成一个线程。类似的东西:
ServerSocket welcomeSocket = new ServerSocket(port);
while (true) {
Socket socket = welcomeSocket.accept();
new Thread(new RunnableSocketWorker(socket));
}
如果您的客户确实决定断开连接,那就没问题了。您想要正在处理它的套接字工作者退出。如果新客户端尝试连接,他们将使用您的ServerSocket对象和此无限循环执行此操作。
Java中套接字相对容易的一个重要原因是此ServerSocket类处理所有传入的新客户端。你为什么要自己编写那部分代码?
只需拿回它的套接字,玩得开心!