【发布时间】: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