2012-11-18 65 views
0
TcpClient client = new TcpClient(); 
client.Connect(IPAddress.Parse(HOST_IP), HOST_PORT); 
Stream stream = client.GetStream(); 
var reader = new StreamReader(stream); 
var writer = new StreamWriter(stream); 
writer.AutoFlush = true; 
while (true) { 
    string line; 
    while((line = reader.ReadLine())!=null) { 
    Console.WriteLine(line); 
    } 
    writer.WriteLine(Console.ReadLine()); 
} 

我的服務器發送兩個字符串到客戶端:如何從具有流的TCP服務器獲取最後一條消息?

var stream = new NetworkStream(soc); 
var reader = new StreamReader(stream); 
var writer = new StreamWriter(stream); 
writer.AutoFlush = true 
writer.WriteLine("Welcome: "); 
writer.WriteLine("Bla...: "); 
reader.ReadLine(); 

我的客戶得到的將顯示

Welcome 
Bla.. 

但不運行命令writer.WriteLine(Console.ReadLine());

+0

你在服務器端不做其他事情嗎?客戶端如何知道,在五分鐘內,服務器可能會進行另一個'writer.WriteLine()'調用,客戶端需要在它的'while'循環中讀取它。 –

+0

對不起,在我的服務器上有'reader.ReadLine()'後寫上 – NamPNQ

+0

是的,但客戶端意味着如何知道服務器不打算髮送另一行文本? (我承認,我的這個問題的第一個措辭並不輝煌) –

回答

1

你需要決定這將如何關閉,但正如評論所示,我建議你使用第二個線程來獲取雙方(發送方和接收方都在cli上ENT)能夠無阻塞運行:

TcpClient client = new TcpClient(); 
client.Connect(IPAddress.Parse(HOST_IP), HOST_PORT); 
Stream stream = client.GetStream(); 
var reader = new StreamReader(stream); 
var writer = new StreamWriter(stream); 
writer.AutoFlush = true; 
var t = new Thread(() => { 
    while(true) { 
     writer.WriteLine(Console.ReadLine()); 
    } 
}); 
t.Start(); 
while (true) { 
    string line; 
    while((line = reader.ReadLine())!=null) { 
    Console.WriteLine(line); 
    } 
} 

與您的評論,你不會想在一個循環來創建線程 - 總有一種可能性,即一側(例如從服務器接收)可以多次處理,而不需要爲另一方做任何工作(發送到服務器)。

對於關機,我通常會創建一個ManualResetEvent,當它關機的時候,它會被設置(通過適當的標準)。然後,我會測試事件對象while循環的條件。

唯一的問題是Console.ReadLine()被阻止。所以你的讀控制檯/發送到服務器線程不會看到關閉事件已被設置,除非它接收到新的輸入。如果你的讀/寫線程不負責啓動關閉,你可以使它成爲一個後臺線程(假設它不改變任何全局狀態),然後處理關閉你的接收/寫入線程(即主線程)在適當的時候。

相關問題