2013-05-13 94 views
0

我試圖使用服務器套接字來建立客戶端和服務器之間的連接。我也沒有使用java.nio服務器套接字 - 發送測試消息以檢測連接

問題是我不斷地發送測試消息,並檢測它是否成功發送消息(客戶端仍然連接),如果沒有,則客戶端斷開連接。

如下所示:

try 
    { 
     Scanner in = new Scanner(socket.getInputStream()); 
     BufferedReader in_2 = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     while(stopThread) 
     { 
       if(in_2.ready()) 
       { 
        String message = in_2.readLine(); 
        dt = new DateTime(); 

        PrintStream out = new PrintStream(socket.getOutputStream()); 
        server.detect(message, dataSets, out); 

        dataSets.add(message); 
        GUI.textArea_1.append(message + "\r\n"); 
        GUI.textArea_1.setCaretPosition(GUI.textArea_1.getDocument().getLength()); 
       } 
       else 
       { 
        PrintStream out = new PrintStream(socket.getOutputStream()); 
        out.println("Testing Connection \r\n"); 
        if(out.checkError()) 
        { 
         try 
         { 
          socket.close(); 
         } 
         catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
         stopThread = false; 
         GUI.textArea.append(userName + " disconnected \r\n"); 
         GUI.textArea.setCaretPosition(GUI.textArea.getDocument().getLength()); 
         server.inputDataForm(userName, dt, dataSets); 
        } 
        Thread.sleep(3000); 
       } 

     } 

的問題是,Thread.sleep(3000)實際上與獲取數據的干擾,因爲在3秒後,我會得到一個巨大的數據量(因爲我停止線3秒) 。

現在,我提出的是在else語句中的一個匿名類。

class runThread implements runnable 
{ 
    void run() 
    { 
      //Put the else statement here 
    } 
} 

但stopThread = FALSE不是一個常數,我試圖控制。

其他線程我搜索的只是把變量放在主要的匿名類中,但是我需要stopThread來停止while循環,如果客戶端斷開。

有沒有人有想法?

謝謝!

回答

1

你爲什麼不做出實現Runnable類,但也有方法的stop();

public class MyRunner implements Runnable(){ 
    MutableBoolean stop = false; 
    public void run(){...} 
    public void stop(){ 
     stop = true; 
    } 
} 
+0

嗯...怎麼會停下來叫呢? – user1157751 2013-05-14 00:05:46

+0

實際上最後我在shutdown()中創建了一個線程,它監視MutableBoolean,並且在客戶端斷開連接時停止。 – user1157751 2013-05-14 00:10:27

+0

如果它工作,那麼很好!你可以通過創建MyRunner來調用stop(),然後在某個地方調用線程外部的stop。 – 2013-05-14 14:10:25

2

考慮設置短timeout on your socket.這將允許您控制在等待從套接字數據的線程將如何長塊。

如果數據不能很快提供,一個非常具體的java.net.SocketTimeoutException將提高。您可以通過檢查您的stopThread標誌來處理此例外情況。如果已設置,則可以從方法返回。否則,套接字仍然有效,您可以在超時後嘗試另一次讀取操作。

如果引發任何其他異常類型,您的套接字可能不再有效。

socket.setSoTimeout(20); /* 1/50th of a second. */ 
    BufferedReader in = new BufferedReader 
    (new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); 
    while (!stop) { 
    try { 
     String message = in.readLine(); 
     if (message == null) 
     handleEOF(); 
     else 
     handleMessage(message); 
    } catch(SocketTimeoutException ignore) { 
     /* Loop back to check "stop" flag. */ 
     continue; 
    } catch(IOException ex) { 
     handleDisconnection(); 
     break; 
    } 
    } 

順便說一句,如果你使用的Swing,記得you can only modify graphical components from Swing's Event Dispatch Thread,,你可以不打領帶了EDT在長時間運行的操作類似這樣的插座處理。您應該將此線程的任務傳遞給Swing的invokeLater()實用程序。