2012-11-18 86 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()被阻止。所以你的读控制台/发送到服务器线程不会看到关闭事件已被设置,除非它接收到新的输入。如果你的读/写线程不负责启动关闭,你可以使它成为一个后台线程(假设它不改变任何全局状态),然后处理关闭你的接收/写入线程(即主线程)在适当的时候。

相关问题