2014-09-29 57 views
1

我有一個TcpClient對此我連接到本機和一切工作fine.Now一個額外的步驟,我想每timer.As的幫助來監控非常60秒的連接狀態話題我才知道,有沒有直接的方法來測試它。所以我試圖通過發送到機器的最近消息的響應時,應用程序就會從網絡中得到它的基礎研究。TcpClient的連接狀態問題

這裏是代碼..

// Find out whether the socket is connected to the remote host. 

//Send a message to Machine 
try 
{ 
    byte[] notify = Encoding.ASCII.GetBytes("Hello"); 
    stream.Write(notify, 0, notify.Length);  
}catch { } 

//Check if it reached to machine or failed 
bool getConnectionStatus = client.Connected; 

if (getConnectionStatus == true) 
    { 
     //Do nothing 
    } 
else 
    { 
     //Stop the thread 
     _shutdownEvent.WaitOne(0); 
     _thread.Abort(); 

     //Start Again 
     _thread = new Thread(DoWork); 
     _thread.Start(); 
     } 

但是,在這種情況下發生的最令人驚訝的事情是,如果機器是從網絡中則也同時寫了第一次能寫而這就是爲什麼連接狀態來作爲連接雖然是出了network.Second時候,它正試圖發送失敗的數據和預期的一樣狀態爲斷開。

我面臨的主要問題是,一旦它從網絡上斷開連接,爲什麼它能夠發送數據。由於這個,我丟失了當網絡運行時存儲在機器中的所有緩衝區數據關閉。 請幫助我..

+0

發送一個「PING」,等待一個「PONG」 – 2014-09-29 13:22:12

+0

@AlexK。很抱歉,我沒有得到你 – 2014-09-29 13:34:33

回答

1

引擎蓋下,該Write操作只是將數據發送到網絡層;在嘗試傳輸數據之前,您可能會獲得「成功」結果。如果數據很小,網絡層甚至可能會延遲發送數據一段時間,試圖一次發送一批一批的幾條消息。

什麼亞歷克斯K.幾句說的是,檢查網絡連接的最可靠的辦法就是等待響應。如果在一段時間內沒有收到這樣的迴應,則連接丟失。

比方說,你繼續使用「你好」,服務器應響應「是啊!」。在客戶端,你可以用你的擴展當前的代碼:

try 
{ 
    byte[] notify = Encoding.ASCII.GetBytes("Hello"); 
    stream.Write(notify, 0, notify.Length); 
    byte[] notifyResult = new byte[5]; 
    int bytesRead = stream.Read(notifyResult, 0, 5); 
    if (bytesRead == 0) 
    { 
     // No network error, but server has disconnected 
    } 

    // Arriving here, notifyResult should contain ASCII "Yeah!" 
} 
catch (SocketException) 
{ 
    // Network error 
} 

在服務器上,你應該認識到「你好」正在發送,並簡單地響應「是啊!」。我不知道你的服務器當前的做法,但它可能是類似於:

switch (receivedMessage) 
{ 
    case "Hello": 
     stream.Write(Encoding.ASCII.GetBytes("Yeah!"), 0, 5); 
     break; 
} 

請注意,你應該考慮在信息包包裹郵件,即:

<Message Type> <Message> <Terminator Character> 
ie. "KHello\n" 

或者

<Size of Message> <Message Type> <Message> 
ie. "0005KHello" 

當消息類型「K」是一個保活消息,換行符「\ n」個的終止符和「0005」的消息長度不含噸他的消息類型。

這樣服務器總是能夠判斷它是否已收到完整的消息,並且消息類型可以指示「Hello」是作爲數據還是作爲保活數據包發送的。

+0

你可以請給我的例子或psudocode連接到我的代碼在post.Activeually我是新的領域,所以沒有明確的條款 – 2014-09-29 13:56:44

+0

@shubhamHegdey增加了一個例子。我希望你能用它取得一些進展。 – 2014-09-29 14:18:45