关闭客户端内的读卡器/输入/插座

时间:2015-04-09 00:36:47

标签: sockets client-server printwriter

我目前正在编写一个非常好用的多客户端聊天程序。我现在唯一的问题是如果它被强行关闭

我明白了:

java.net.SocketException: Connection reset

我相信(从四处看看)这与在客户端内没有正确关闭流/套接字有关。但是,我已经尝试了很多位置来关闭所有内容,我似乎无法弄明白。有人能指出我正确的方向吗?

继承客户:(没有GUI的东西) 套接字和流被定义为属性。

    public void connectToServer(){
      try{
         System.out.println("Waiting to connect");
         s = new Socket("localhost", 16789);   
         System.out.println("Connected");
         ClientThread ct = new ClientThread();
         ct.start(); 
         openStreams();         
      }

      catch(EOFException eofe){
         System.out.println("EOFException");
      }

      catch(IOException ioe){
         System.out.println("IO Error");
      }
   }

   public void openStreams(){

      try {
      //open input streams
         InputStream in = s.getInputStream();
         br = new BufferedReader(
                              new InputStreamReader(in));                             

      //open output streams

         OutputStream out = s.getOutputStream();
         pw = new PrintWriter(
                       new OutputStreamWriter(out));

      }
      catch(ConnectException ce){
         System.out.println("Could not connect");
      }
      catch(IOException ioe){
         System.out.println("IO Error");
      }
      catch(NullPointerException npe){
         System.out.print("Server offline");
         System.exit(0);
      }

   }

   public void closeStreams(){
      try{
         pw.close();
         br.close();
         s.close();
         }
      catch(IOException ioe){
         ioe.printStackTrace();
      }
   }

   public void sendMsg(){    
      String message = enterMsg.getText();
      pw.println(message);
      pw.flush();
   }

   public void showMsg(){

      String show;
      try{
         while((show = br.readLine()) != null){
            chatArea.append(show + " \n");   
         }
      }
      catch(IOException ioe){
         chatArea.append("Error showing msg \n");
      }   
   }   

   class ClientThread extends Thread {
      public void run(){
            showMsg();
            closeStreams();
      }   
   }
}

服务器指向的特定部分包含错误:

     while( ( msg = br.readLine()) != null ){  
        System.out.print(msg);            
        // convert & send msg to client
           for(PrintWriter pw : clients){
              pw.println(userName + ":" + msg );
              pw.flush();
           }     

        }

1 个答案:

答案 0 :(得分:0)

java.net.SocketException: Connection reset

最常见的原因是:

  1. 您已写入已被对等方关闭的连接。
  2. 对等方关闭了连接而未读取所有待处理的传入数据。
  3. 正确的恢复是关闭套接字并忘记该对等体,但两者都是应用程序协议错误,应该进行调查。

      

    这与在客户端

    中未正确关闭流/套接字有关

    不,不是。它与过早地关闭它们,无论哪个同伴都没有得到这个例外。

    关于'正确关闭流',只需关闭PrintWriter.关闭Socket的输入或输出流关闭另一个流和套接字本身,你应该选择要关闭的最外面的输出流/写入器,以便刷新它。