【问题标题】:How to read whenever there is an incoming message in Tcp socket programming in C#如何在 C# 中的 Tcp 套接字编程中有传入消息时读取
【发布时间】:2013-12-15 10:17:44
【问题描述】:

我有一个用 .NET C# 编写的服务器-客户端程序。我使用过套接字编程,到目前为止服务器和客户端都在工作。只有一个服务器实例,而我可以将多个客户端连接在一起。 现在我的代码就像下面的场景一样工作。

当我启动服务器代码时,它会开始侦听。当我启动客户端时,它会等待在控制台上写入命令。在我写了一些东西之后,客户端将它发送到服务器,然后服务器用它做一些事情,写回一些东西。这就是循环的方式。就像一场乒乓球比赛。 我的客户端代码在这个link 中可用。

问题和我想要的: 使用此功能,我的客户端无法监听服务器,除非它向服务器写入内容。每当有传入消息时,我想让它听。我的服务器代码很好,服务器的顺序(听然后写)没问题。客户端序列(写听)也可以,但我的客户端除非写入,否则无法读取。假设两个客户端正在与服务器通信。 client1 告诉服务器-“嘿,我需要属于 client2 的东西”,然后服务器将向 client2 发送消息。使用当前代码,client2 无法收听消息,因为它实际上正在等待写入。希望我说清楚了。

我怎样才能做到这一点?任何代码示例都会有所帮助。谢谢。

【问题讨论】:

  • 只需调用 BeginReceive()。每当服务器发送未经请求的内容时,您的回调就会运行。处理完数据并发送响应后,再次调用 BeginReceive()。
  • @HansPassant 我实际上很担心从服务器接收整个数据。所以我决定循环缓冲区。但我在服务器端使用了 BeginReceive()。我会再检查一遍!
  • @HansPassant 我发现 BeginReceive() 的问题是代码只是在该部分阻塞并且不会继续,除非它从服务器获得任何响应。这不是 Read() 方法的情况,它只是在缓冲区中没有任何内容时返回 0。我还是卡住了。

标签: c# sockets .net-4.5 tcpclient


【解决方案1】:

您需要的不仅仅是客户端上的线程。一种用于接受控制台输入和发送,另一种用于读取 TCP 流(阻塞)并显示。在控制台上让它看起来像 IRC 有点棘手,因为用户写入的字符和接收的字符会交错。

【讨论】:

  • 我实际上尝试了一些线程,可能是我用了错误的方式或其他什么,没有成功。你能在代码中显示出来吗?也许编辑我的pastebin?谢谢
  • @Pro.metal 没有。请不要让别人为你做这项工作。改为显示您的线程实现并描述什么不起作用。或谷歌解决方案:youtube.com/watch?v=_u4f1AA5I0M
  • 你可能误会了我的意思。无论如何,这是我的代码 pastebin.com/yzXrpFcF 。我的线程理解处于初学者水平,并没有按照我想要的方式进行。
  • YouTube 链接人没有完成他的项目。为什么要分享一个不完整的链接?我也试过this。没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多