Socket通讯编程之资源回收的问题

在客户端要关闭socket之前需要先通过发送消息告诉服务器端:
    //通知服务器端关闭socket
    pw.println(version + author + time + "bye" + end);
1、服务器端收到消息后转发消息给客户端关闭socket的消息并关闭,并退出while循环或者结束该socket的接收线程:

Code:
  1.     while(true){   
  2.         try {   
  3.   
  4.         //等待客户端的连接   
  5.         ss=s.accept();   
  6.         InputStreamReader isr=new InputStreamReader(ss.getInputStream());   
  7.         BufferedReader br=new BufferedReader(isr);   
  8.            
  9.         pw=new PrintWriter(ss.getOutputStream(),true);   
  10.            
  11.         while(true)   
  12.         {   
  13.             String info=br.readLine();   
  14.                
  15.                
  16.             Protocol pro = new Protocol();   
  17.             String result = pro.analyzing(info);   
  18.            
  19.             if(result == "pzx" ){   
  20.                 if(pro.getMessage_text().equals("bye")) {   
  21.                     //服务器端转发给客户端socket关闭中,也可不转发直接在接受到消息前客户端自动关闭,也不需要第二步了   
  22.                     pw.println("ok");   
  23.                     pw.close();   
  24.                     br.close();   
  25.                     isr.close();   
  26.                     ss.close();   
  27.                     break;      //退出服务器的接收循环,但还在等待客户端的连接   
  28.                 } else {   
  29.                     jta.append("客户端对服务器说("+pro.getDateTime()+"):/r/n"+"  "+pro.getMessage_text()+"/r/n");   
  30.                 }   
  31.             } else {   
  32.                 jta.append("来自客户端的非法消息:"+result+"/r/n");   
  33.             }                  
  34.         }   
  35.     } catch (IOException e) {   
  36.         e.printStackTrace();   
  37.     }   
  38.     }   
  39. }  

  
2、客户端收到消息后关闭接收线程,关闭资源:

Code:
  1.         while(true)   
  2.         {   
  3.             //不停地读取从服务器端发来的信息   
  4.             String info;   
  5.             try {   
  6.                 info = br.readLine();   
  7.                 if(info.equals("ok")) {   
  8.                     //如果接收到客户端的关闭消息,则结束接收的线程,s,pw,br此时都为空,最好关闭它们   
  9. //                  pw.close();   
  10. //                  br.close();   
  11. //                  s.close();   
  12. //                  System.out.println("服务器端socket已经断开");   
  13.                     break;   
  14. //                  System.exit(0);   
  15.                 } else {   
  16.                     mc.jta.append("服务器对客户端说:/r/n"+"  "+info+"/r/n");   
  17.                 }   
  18.             } catch (IOException e) {   
  19.                 // TODO Auto-generated catch block   
  20.                 e.printStackTrace();   
  21.             }                  
  22.                
  23.         }     


   

发布了14 篇原创文章 · 获赞 1 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/peng_zhanxuan/article/details/6516303