首页 > 解决方案 > Websocket 服务器发送自发消息(没有来自客户端的请求)

问题描述

我必须承认我可能错过了一些基本的东西。如果有,请指出。以下是我对 websocket 服务器的理解。

我正在尝试编写一个 websocket 服务器,它应该让客户端更新他们请求执行的作业的状态。有一个初始交换,客户端在其中标识自己并发送作业 ID,但从那一刻起,客户端基本上不会向服务器发送任何其他消息。服务器一旦知道其后端状态的更新,就会向客户端发送一条消息,客户端做出相应的反应(通常没有消息返回)。

这是我的第一个 websocket 服务器,所以我按照微软的这个示例作为参考:https ://code.msdn.microsoft.com/The-simple-WebSocket-4524921c

该示例实现了一个回显服务器,用于回复客户端消息。由于我的不同需求,我重写了它,以便在循环ReceiveAsync之前调用一次。while在循环内部,我的服务器检查其状态,并在需要时发送更新消息。

但是,如果我要ReceiveAsyncwhile循环中调用(我的更新消息逻辑也是如此),那么循环将基本上被阻塞:如果我await要接收消息,但客户端通常不发送任何消息,我实际上是阻止我的服务器进入循环的下一次迭代。所以我删除了调用ReceiveAsync:我不期望消息,一切正常。

我的问题是我没有检查关闭消息,因为我ReceiveAsync只打电话一次。另外,我没有实际的全双工,现在还可以,但是将来可能会改变(或针对不同的项目)。

所以,关于实际问题:

1)专门等待Close消息重要吗?或者我可以假设当客户端的 websocket 对象被销毁时,websocket 会自动被杀死?

2)如何实现全双工通信?在传统的套接字中,我会有一个无限循环,我会检查是否有东西要读取(构造消息,使用它等),然后如果有东西要发送给客户端,然后迭代:如果没有阅读我会继续。但ReceiveAsync似乎是接收数据或检查是否有任何数据的唯一方法,如果没有数据它只是坐在那里并且永远不会完成。

我应该停止使用System.Net.Websockets并转向功能更强大的库吗?我发现的所有这些都是指“回复”客户消息,所以我不确定它们是否适合我的需求(也许这只是一个糟糕的示例和文档)。

标签: c#system.net.websockets

解决方案


推荐阅读