1. 程式人生 > >Socket通訊程式設計之資源回收的問題

Socket通訊程式設計之資源回收的問題

在客戶端要關閉socket之前需要先通過傳送訊息告訴伺服器端:
    //通知伺服器端關閉socket
    pw.println(version + author + time + "bye" + end);
1、伺服器端收到訊息後轉發訊息給客戶端關閉socket的訊息並關閉,並退出while迴圈或者結束該socket的接收執行緒:

Code:
  1. while(true){   
  2. try {   
  3. //等待客戶端的連線
  4.         ss=s.accept();   
  5.         InputStreamReader isr=new InputStreamReader(ss.getInputStream());   
  6.         BufferedReader br=new BufferedReader(isr);   
  7.         pw=new PrintWriter(ss.getOutputStream(),true);   
  8. while(true)   
  9.         {   
  10.             String info=br.readLine();   
  11.             Protocol pro = new Protocol();   
  12.             String result = pro.analyzing(info);   
  13. if(result == "pzx" ){   
  14. if(pro.getMessage_text().equals("bye")) {   
  15. //伺服器端轉發給客戶端socket關閉中,也可不轉發直接在接受到訊息前客戶端自動關閉,也不需要第二步了
  16.                     pw.println("ok");   
  17.                     pw.close();   
  18.                     br.close();   
  19.                     isr.close();   
  20.                     ss.close();   
  21. break;      //退出伺服器的接收迴圈,但還在等待客戶端的連線
  22.                 } else {   
  23.                     jta.append("客戶端對伺服器說("+pro.getDateTime()+"):/r/n"+"  "+pro.getMessage_text()+"/r/n");   
  24.                 }   
  25.             } else {   
  26.                 jta.append("來自客戶端的非法訊息:"+result+"/r/n");   
  27.             }                  
  28.         }   
  29.     } catch (IOException e) {   
  30.         e.printStackTrace();   
  31.     }   
  32.     }   
  33. }  

  
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.         }