【发布时间】:2016-08-15 18:57:48
【问题描述】:
我用 C# WPF 为一个客户端和服务器编写了一个 TCP 聊天(它可以工作)。现在我想扩展这个程序,让更多的客户参与聊天。
客户端代码:http://pastebin.com/Zv1Me6P4
服务器代码:http://pastebin.com/VYBJCA9f
我正在检查所有内容,我猜 streamreader readline 失败了。
在我的程序中,客户端向服务器发送消息,服务器发送给每个人并在他们的文本框中显示消息。
我的程序是如何工作的:
- 启动服务器
- 连接 Client1、Client2
- Client1 发送消息“a”...没有任何反应
- Client1 发送消息“b”...没有任何反应
- 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永远不会是true和ReadLine将始终阻塞。您不能使用常规的流式读取示例。 -
感谢您的回复,如果我无法使用它,我该如何解决?请给我任何提示。最好的问候
-
不客气。这里的空间有限,无法涵盖完整的解决方案。但是您似乎已经知道解决方案 - 尝试使用每个客户端的线程(当然我说的是服务器代码),或者尝试使用更新的异步功能。例如,看看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