尝试重新打开连接时出现Socket Closed错误

时间:2013-11-23 01:27:03

标签: java

我正在制作一个程序,要求每次客户端从服务器接收数据时都要更新UI。为此,必须每次关闭并重新打开套接字和serversocket。虽然当程序试图接受新连接时,这是我的代码和错误:

    public void startServer(){
    Thread serverstart = new Thread(){
        public void run() {
                try {       
                    serversocket = new ServerSocket(socket);

                    while(true){
                        skt = serversocket.accept();
                        close.setEnabled(true);
                        new Thread(new newClient(skt)).start();
                    }
            } catch (IOException e){
                e.printStackTrace();
              }
        }
    };serverstart.start();
}
static class newClient implements Runnable {
    private Socket socket;
    static PrintStream output;
    public newClient(Socket skt){
        this.socket = skt;
    }
    @Override
    public void run(){
        try {
        output = new PrintStream(socket.getOutputStream());
        } catch(IOException ioe){
            ioe.printStackTrace();
        }
    }
}

    public void sendData(){                 
        tallydata = Integer.toString(preview) + " " + Integer.toString(program);        
                System.out.println(tallydata);
                newClient.output.print(tallydata);

        try{
                skt.close();
                serversocket.close();
            } catch(IOException e){
                e.printStackTrace();
            } 
            startServer();                  
    }

套接字在sendData()方法结束时关闭,并且调用startServer()方法以在此之后再次重新启动连接。这是错误:

java.net.SocketException: Socket closed
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
    at java.net.ServerSocket.implAccept(ServerSocket.java:522)
    at java.net.ServerSocket.accept(ServerSocket.java:490)
    at TallySystem.servergui$1.run(servergui.java:201)

感谢。

1 个答案:

答案 0 :(得分:0)

为什么要关闭并重新打开服务器?只需启动它一次就可以了。这应该如何使用。

无论如何,根据ServerSocket documentation

  

public void close()

     

关闭此套接字。当前在accept()中被阻塞的任何线程都将抛出SocketException。

这正是你的问题所在。您正在忙着等待连接时关闭ServerSocket。