Socket通訊程式設計之資源回收的問題
阿新 • • 發佈:2019-01-06
在客戶端要關閉socket之前需要先通過傳送訊息告訴伺服器端:
//通知伺服器端關閉socket
pw.println(version + author + time + "bye" + end);
1、伺服器端收到訊息後轉發訊息給客戶端關閉socket的訊息並關閉,並退出while迴圈或者結束該socket的接收執行緒:
- while(true){
- try {
- //等待客戶端的連線
- ss=s.accept();
- InputStreamReader isr=new InputStreamReader(ss.getInputStream());
- BufferedReader br=new BufferedReader(isr);
- pw=new PrintWriter(ss.getOutputStream(),true);
- while(true)
- {
- String info=br.readLine();
- Protocol pro = new Protocol();
- String result = pro.analyzing(info);
- if(result == "pzx" ){
- if(pro.getMessage_text().equals("bye")) {
- //伺服器端轉發給客戶端socket關閉中,也可不轉發直接在接受到訊息前客戶端自動關閉,也不需要第二步了
- pw.println("ok");
- pw.close();
- br.close();
- isr.close();
- ss.close();
- break; //退出伺服器的接收迴圈,但還在等待客戶端的連線
- } else {
- jta.append("客戶端對伺服器說("+pro.getDateTime()+"):/r/n"+" "+pro.getMessage_text()+"/r/n");
- }
- } else {
- jta.append("來自客戶端的非法訊息:"+result+"/r/n");
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
2、客戶端收到訊息後關閉接收執行緒,關閉資源:
- while(true)
- {
- //不停地讀取從伺服器端發來的資訊
- String info;
- try {
- info = br.readLine();
- if(info.equals("ok")) {
- //如果接收到客戶端的關閉訊息,則結束接收的執行緒,s,pw,br此時都為空,最好關閉它們
- // pw.close();
- // br.close();
- // s.close();
- // System.out.println("伺服器端socket已經斷開");
- break;
- // System.exit(0);
- } else {
- mc.jta.append("伺服器對客戶端說:/r/n"+" "+info+"/r/n");
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }