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());
}

我的服务器向客户端发送两个字符串:

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());

4

1 回答 1

1

您需要决定这一切将如何关闭,但如评论中所示,我建议您使用第二个线程,让双方(客户端上的发送和接收端)能够在没有阻塞的情况下运行:

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()阻塞。因此,除非接收到新输入,否则您的读取控制台/发送到服务器线程不会看到已设置关闭事件。如果您的读取/发送线程不负责启动关闭,您可以将其设为后台线程(假设它不会改变任何全局状态),然后只需处理关闭您的接收/写入线程(即主线程)在适当的时候。

于 2012-11-18T16:28:59.710 回答