(Java多客户端服务器)当客户端关闭套接字并且服务器写入客户端

时间:2015-10-22 03:16:03

标签: java sockets client-server

服务器代码:

public class Main {
    public static void main(String args[]){
        Socket s=null;
        ServerSocket ss2=null;
        System.out.println("Server Listening......");
        try{
            ss2 = new ServerSocket(8080);
        }
        catch(IOException e){
            e.printStackTrace();
            System.out.println("Server error");
        }

        while(true){
            try{
                s = ss2.accept();
                ss2.setReuseAddress(true);
                System.out.println("connection Established");
                ServerThread st=new ServerThread(s);
                st.start();
            }
            catch(Exception e){
                e.printStackTrace();
                System.out.println("Connection Error");
            }
        }
    }
}

class ServerThread extends Thread{  

    String line; = "testing";
    PrintWriter os=null;
    Socket s=null;

    public ServerThread(Socket s){
        this.s=s;
    }

    public void run() {
        try{
            os=new PrintWriter(s.getOutputStream());

        }catch(IOException e){
            System.out.println("IO error in server thread");
        }

        try {
            for (int i = 0 ; i < 100 ; i++){
                os.println(line);
                os.flush();
                Thread.sleep(1000);
            }
        }
        catch(NullPointerException | IOException | InterruptedException e){
            System.out.println("Client "+line+" Closed");
        }

        finally{    
            try{
                System.out.println("Connection Closing..");

                if(os!=null){
                    os.close();
                    System.out.println("Socket Out Closed");
                }
                if (s!=null){
                s.close();
                System.out.println("Socket Closed");
                }

                }
            catch(IOException ie){
                System.out.println("Socket Close Error");
            }
        }//end finally
    }

当客户端连接到服务器时,服务器开始打印。但是当客户端关闭套接字时,服务器仍然保持println。假设服务器会抛出异常?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

  1. PrintWriter吞下例外情况。见Javadoc。
  2. 出于缓冲原因,对于已被对等方关闭的连接的第一次写入,您永远不会得到异常。您最终将获得“重置连接”。但从来没有在第一次写作。
  3. 在绑定setReuseAddress()之后调用ServerSocket完全没有意义,就像在循环中调用它一样。

答案 1 :(得分:0)

我认为你应该在完成片刻时添加ss2.close()s.close()

while(true){
    try{
    s = ss2.accept();
    ss2.setReuseAddress(true);
    System.out.println("connection Established");
    ServerThread st=new ServerThread(s);
    st.start();
    }
    catch(Exception e){
        e.printStackTrace();
        System.out.println("Connection Error");
     }
 }
 ss2.close();
 s.close();