2011-04-08 39 views
3

通過我的代碼,我可以讀取服務器上的消息並從客戶端進行寫入。但是我無法從服務器寫入響應並讀取客戶端。如何向服務器發送「hello」並回復「hi」?

client

var cli = new TcpClient(); 

cli.Connect("127.0.0.1", 6800); 

string data = String.Empty; 

using (var ns = cli.GetStream()) 
{ 
    using (var sw = new StreamWriter(ns)) 
    { 
     sw.Write("Hello"); 
     sw.Flush(); 

     //using (var sr = new StreamReader(ns)) 
     //{ 
     // data = sr.ReadToEnd(); 
     //} 
    } 
} 

cli.Close(); 

代碼代碼在server

tcpListener = new TcpListener(IPAddress.Any, port); 
tcpListener.Start(); 

while (run) 
{ 
    var client = tcpListener.AcceptTcpClient(); 

    string data = String.Empty; 

    using (var ns = client.GetStream()) 
    { 
     using (var sr = new StreamReader(ns)) 
     { 
      data = sr.ReadToEnd(); 

      //using (var sw = new StreamWriter(ns)) 
      //{ 
      // sw.WriteLine("Hi"); 
      // sw.Flush(); 
      //} 
     } 
    } 
    client.Close(); 
} 

我怎樣才能使讀取數據,並讀取該數據後,客戶端服務器的回覆?

回答

3

由於您使用

TcpClient client = tcpListener.AcceptTcpClient(); 

,你可以寫回客戶端直接內無需自我認同。 如果您使用Stream.Read().ReadLine()而不是.ReadToEnd(),您擁有的代碼實際上可以工作ReadToEnd()將在網絡流上永遠阻塞,直到流被關閉。見this answer到類似的問題,或從MSDN

ReadToEnd的假設,當它已經到頭流 知道。對於 其中 服務器發送數據,只有當你問 它並不會關閉 連接,ReadToEnd的可能會阻止 下去,因爲它沒有達到 結束,並應避免交互協議。

如果您在一側使用ReadLine(),則需要在另一側使用WriteLine()而不是Write()。另一種方法是使用一個調用Stream.Read()的循環,直到沒有什麼需要讀取。您可以在AcceptTcpClient() documentation on MSDN中看到服務器端的完整示例。相應的客戶端示例位於TcpClient documentation中。

0

不好的,inneficient,但確實對一次性一次性項目的伎倆:

  • 客戶:在流,包括端口和IP地址它希望收到的響應。
  • 客戶端:爲該 端口和IP創建一個偵聽器。
  • 服務器:讀取端口/ IP信息和 依次連接,然後發送回覆 流。

但是,this is a great place to start,請查看Sockets類以進行適當的雙向通信。

相關問題