如何在客户端突然断开连接后保持服务器套接字活动?

时间:2015-10-27 02:20:20

标签: java sockets

一旦客户端断开连接并重新启动客户端,服务器就会给出读取线超时。当我再次运行服务器时,它工作正常。因此,在断开连接一次后,我得到读取线超时异常,下次它会工作。

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!!!");
           }

        } 
    }
}

1 个答案:

答案 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类处理所有传入的新客户端。你为什么要自己编写那部分代码?

只需拿回它的套接字,玩得开心!