【问题标题】:streamreader readline blocking tcp many clients c#streamreader readline 阻塞 tcp 许多客户端 c#
【发布时间】:2016-08-15 18:57:48
【问题描述】:

我用 C# WPF 为一个客户端和服务器编写了一个 TCP 聊天(它可以工作)。现在我想扩展这个程序,让更多的客户参与聊天。

客户端代码:http://pastebin.com/Zv1Me6P4

服务器代码:http://pastebin.com/VYBJCA9f

我正在检查所有内容,我猜 streamreader readline 失败了。

在我的程序中,客户端向服务器发送消息,服务器发送给每个人并在他们的文本框中显示消息。

我的程序是如何工作的:

  1. 启动服务器
  2. 连接 Client1、Client2
  3. Client1 发送消息“a”...没有任何反应
  4. Client1 发送消息“b”...没有任何反应
  5. Client2 发送消息“c”...两个客户端都收到“ac”

Streamreader 阻止,我不知道如何解除阻止。好的,我可以使用新线程; +1 客户端 = +1 线程,但这听起来很奇怪。我真的在阅读 stackOverFlow 并且发现了类似的东西:while((line = reader.ReadLine()) != null) 或 !reader.EndOfStream 或 reader.pike > 0.. 所有这些都不起作用......或者我做错了。

阅读我的代码你可能会感到困惑:

  • 在客户端程序中有一些服务器(它是旧的覆盖项目)
  • 我为每个客户创建新的读写器流;我知道我可以使用一个 R/W Stream 但我不能使用它。因为我使用 List list 所以:reader(list.getByte()) 不起作用。

求求你帮帮我。这是我工作中未解决的一小部分,这让我很沮丧。当问题合理且可以解决时,我喜欢编程。

感谢您在我的帖子下发表的所有评论。

【问题讨论】:

  • NetworkStream 不像其他流。 reader.EndOfStream 永远不会是 trueReadLine 将始终阻塞。您不能使用常规的流式读取示例。
  • 感谢您的回复,如果我无法使用它,我该如何解决?请给我任何提示。最好的问候
  • 不客气。这里的空间有限,无法涵盖完整的解决方案。但是您似乎已经知道解决方案 - 尝试使用每个客户端的线程(当然我说的是服务器代码),或者尝试使用更新的异步功能。例如,看看Using .Net 4.5 Async Feature for Socket Programming 线程。
  • 在阅读您的帖子之前,我为新客户尝试了新线程。 BackgroundWorker clientThread = new BackgroundWorker(); clientThread.WorkerSupportsCancellation = true; clientThread.DoWork += new DoWorkEventHandler(clientThread_DoWork); clientThread.RunWorkerAsync(clientNumber);现在它可以工作了:D!之前看起来很奇怪,我的小服务器和许多新客户端有这么多线程。但这是唯一的方法。感谢您的支持:)!

标签: c# wpf multithreading tcp chat


【解决方案1】:

我遇到了类似的问题,无法 ReadLine 和 ReadToEnd 会超过我的超时时间。这对我有用

string line = "";
while (reader.Peek() > -1) {
    line += (char)reader.Read();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2016-03-18
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多