2015-07-11 47 views
3

即時通訊新的Java和即時通訊嘗試使客戶端服務器的形式。客戶端和服務器可以相互聊天。所以我的客戶有2個任務的線程:發送和接收消息。我想當我的SendThread從鍵盤字符串「再見」讀取時,我的客戶端將停止2線程。但問題是線程接收仍然執行的BufferedReader聲明的ReadLine(),所以它不能達到出口 這裏是我的我的代碼:如何停止BufferedReader readline()?

 try { 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      while (!stop) { 
       String temp = br.readLine(); 
       if (temp.length() == 0) { 
        Thread.sleep(100); 
       } 
       else System.out.println(" Receiving from server: " + temp); 
      } 
     } catch (IOException | InterruptedException e) { 
      e.printStackTrace(); 
     } 

更新:對不起大家,因爲我不解釋更清晰。我的客戶有2個線程獨立運行。因此,此代碼所在的ReceiveThread可以一直等待來自服務器的消息。 SendThread也一直從鍵盤讀取數據。所以當我輸入「Bye」時,SendThread讀取這個字符串並停止客戶端。問題是ReceiveThread正在執行readLine(),因此無法自行停止。當有流的末尾

+0

'而(!停止)'怪條件,因爲你不改變'stop'。 – Tom

+0

當我關閉我的SendThread時,'stop'會改變。我不會在這裏發佈代碼 –

+0

如果服務器關閉了套接字,你是否關閉該線程?因爲這是你想停止閱讀的條件之一。你在哪裏處理收到的消息「再見」?如果試圖更改代碼時「無處」,則可以檢測到封閉的流或消息「再見」。目前的答案可能會幫助你。 – Tom

回答

3

按照javadocnull參考將被退回,所以我這樣做:

br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String temp; 
while ((temp=br.readLine())!=null) { //check null reference 
    if (temp.length() == 0) 
     Thread.sleep(100); 
    else 
     System.out.println(" Receiving from server: " + temp); 
} 

它,這不是有益看到How to interrupt BufferedReader's readLine

+1

根據Javadoc,null返回*在流結束*,這意味着peer已斷開連接,這意味着您應該停止讀取,退出循環並關閉套接字。無事可讀「。 – EJP

+0

更正@EJP,+1給你的回答和解釋 – maskacovnik

+1

不是。你實際上沒有展示如何回答這個問題。很難看到睡在空白線上的東西對你來說也是如此。 – EJP

0

下面是一個例子如何通過關閉插槽來停止readLine()

final Socket s = new Socket("localhost", 9999); 
    BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream())); 

    // this thread will close socket in a second 
    new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(1000); 
       s.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }; 
    }.start(); 

    r.readLine(); 
4

將輸入插座關閉,這將導致readLine()返回null,之後讀線程應該關閉套接字。

2

爲什麼不做同樣的事情回到客戶端呢?當服務器收到「再見」時,向客戶端發送「再見」,並在客戶端收到此退出。

在服務器

if (inputLine.equalsIgnoreCase("bye")) { 
    out.println("byebye"); 
    socket.close(); 
    break; 
} 

而在客戶端

if (resp.equals("byebye")) { 
    break; 
} 
相關問題