2009-10-23 99 views
4

我有以下代碼:如何使用TcpListener發送數據並等待響應?

using (TcpClient client = new TcpClient()) 
{ 
    client.Connect(host, port); 

    using (SslStream stream = new SslStream(client.GetStream(), true)) 
    { 
     stream.AuthenticateAsClient(host); 

     stream.Write(System.Text.Encoding.ASCII.GetBytes(dataToSend)); 

     int byteRead = 0; 
     byte[] buffer = new byte[1000]; 

     do 
     { 
     byteRead = stream.Read(buffer, 0, 1000); 
     reponse += System.Text.Encoding.ASCII.GetString(buffer, 0, byteRead); 
     } 
     while (byteRead > 0); 
    } 
} 

我發送一個字符串到服務器,然後等待響應。

這是正確的方法嗎?

如果服務器需要一些時間來處理我發送的內容,它仍然會工作或將流.Read返回0並退出循環?或者,如果響應中的某些數據包丟失並需要重新發送,它是否仍然有效?

+0

您不應該擔心TCP連接丟失數據,而是由網絡代碼來確保通過再次詢問丟失的數據包不會發生。它對你的應用程序是透明的。 – RedGlyph 2009-10-23 20:06:58

+0

我知道我不能丟失數據,但我擔心延遲的數據。我不知道Read會阻止。 MSDN文檔不是很清楚。它說: 「此方法讀取數據到buffer參數並返回成功讀取的字節數。如果沒有數據可用於讀取,則Read方法返回0.」 所以我認爲,如果服務器還沒有處理我的字符串,我的閱讀將返回0,我永遠不會收到任何東西。 由於Read是一種阻止方法,所以沒關係。 – Kevin 2009-10-23 22:51:42

回答

5

代碼的整體結構看起來不錯。

byteRead = stream.Read(buffer, 0, 1000);將阻塞,直到從服務器檢索到所有響應數據。如果遠程服務器關閉連接(超時等),則返回0。

查看備註found here

該框架將正確處理在網絡操作期間丟失的數據包 - 不用擔心它們。

-1
public string Method() 
{ 
    m_Client = new TcpClient(); 
    m_Client.Connect(m_Server, m_Port); 
    m_Stream = m_Client.GetStream(); 
    m_Writer = new StreamWriter(m_Stream); 
    m_Reader = new StreamReader(m_Stream); 
    m_Writer.WriteLine(request); 
    m_Writer.Flush(); 

    return m_Reader.ReadToEnd(); 
} 
+1

如果可以的話,我會給你一個-1。不關閉TcpClient和使用'm_Client.GetStream()'檢索到的NetworkStream只是乞求內存泄漏。原來的海報用'using'語句正確編碼。 – Brandon 2009-10-23 20:29:07

+0

這只是一個例子。如果你看到變量名稱,我應該知道它們是類成員。要發佈在這裏,我剛剛加入了2個或更多的方法。在製作中,我沒有使用上面的代碼。 – Zote 2009-10-26 10:34:44