2013-09-23 26 views
0

我遇到了我正在處理的TCP客戶端的問題。出於某種原因,客戶端似乎正在連接,但它不會讀取任何內容到輸出框。這裏是代碼:簡單TCP客戶端C#Windows窗體的問題

private void button1_Click(object sender, EventArgs e) 
    { 
     string host = textBox1.Text; 

     int port; 
      port = Convert.ToInt32(textBox2.Text); 
      port = int.Parse(textBox2.Text); 

     string sendText = textBox3.Text; 

     Socket connectSocket = new Socket(AddressFamily.InterNetwork, 
      SocketType.Stream, ProtocolType.Tcp); 

     connectSocket.Connect(host, port); 

     System.IO.StreamReader connectionRead 
      = new System.IO.StreamReader(new NetworkStream(connectSocket)); 

     connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(sendText)); 

     while (connectionRead.Peek() > 0) 
     { 
      this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n"); 
     } 

     connectSocket.Close(); 
    } 

對於名稱我很抱歉,我有點急於做到這一點。不過,應該不難理解。我從textBox(s)接收用戶輸入並將其放入變量中。

我似乎被卡住在:

while (connectionRead.Peek() > 0) 
{ 
    this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n"); 
} 

這裏,程序凍結20秒左右,然後用無輸出解鎖(程序不會崩潰)。

任何幫助都很讚賞!

+0

對方是否發送任何數據? – McKay

+0

更具體一點,對方是否發送NewLine字符? – I4V

+0

我不確定如何判斷對方是否真的發送任何東西。這是我的第一個TCP項目,哈哈。 –

回答

0

我認爲大部分問題在於你的假設,如果有一個可用的字符流(你檢查StreamReader.Peek()),那麼你現在也有一個完整的內容行。無法保證(您可能只收到了「Hello world \ n」數據中的「Hello wo」),因此撥打ReadLine()將會阻止,直到收到'\n'

但是,我不確定爲什麼每次返回前都等待20秒。 NetworkStream的默認ReadTimeoutTimeout.Infinite。你確定連接沒有被服務器終止嗎?它可能被配置爲在關閉連接之前等待大約20秒的「靜音」(相當常見)。

另外,您也可以將您的狀況更改爲while (connectionRead.Peek() > -1)Peek()返回字符整數,並且0是有效值('\0')。

+0

我實際上已經嘗試了-1,並得到了相同的結果。我認爲你對服務器終止連接是正確的。你如何建議我測試以查看我是否獲得了完整的代碼?或者,即使沒有'\ n',是否可以簡單地輸出我所得到的結果? –

+0

一個簡單的方法把你接收到的所有東西放到TextBox中,將會把while循環的內容改成'char c =(char)connectionRead.Read(); textBox4.AppendText(c.ToString()+「\ r \ n」);'這將把你得到的數據逐個字符地放在方框中。如果你得到垃圾,你可能會接收可打印字符範圍以外的字節,並且你需要遍歷代碼,看看'c'的值是多少。至於服務器,這取決於。你在和哪個軟件通話? – Nick

+0

我正在嘗試通過GET /HTTP/1.0與www.google.com交談。 –