我必须承认我可能错过了一些基本的东西。如果是这样,请指出。以下是我如何理解websocket服务器。
我正在尝试编写一个websocket服务器,该服务器应该让客户端更新他们请求执行的作业的状态。客户端识别自身并发送作业ID的初始交换,但从那时起,客户端基本上不会向服务器发送任何其他消息。服务器一旦知道其后端状态的更新,就会向客户端发送一条消息,该消息会做出相应的反应(通常没有回复消息)。
这是我的第一个websocket服务器,所以我按照Microsoft的这个示例作为参考:https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c
该示例实现了一个回复客户端消息的echo服务器。由于我的不同需求,我重写了它,以便在ReceiveAsync
循环之前调用while
一次。在循环内部,我的服务器检查其状态,并在需要时发送更新消息。
但是,如果我要在ReceiveAsync
循环中调用while
(我的更新消息逻辑也是如此),那么循环基本上会被阻止:如果我要await
接收一条消息,但客户端通常不发送任何消息,我有效地防止我的服务器进入循环的下一次迭代。所以我删除了ReceiveAsync
的电话:我不期待消息,一切正常。
我的问题是我没有检查关闭消息,因为我只调用ReceiveAsync
一次。此外,我没有实际的全双工,现在很好,但这可能会在未来(或针对不同的项目)发生变化。
所以,关于实际问题:
1)专门等待Close
消息是否很重要?或者我可以假设当客户端的websocket对象被销毁时,websocket会被自动终止吗?
2)如何实现全双工通信?在传统套接字中,我有一个无限循环,我要检查是否有某些内容读取(构造消息,消费它等),然后如果有东西要发送给客户端,那么迭代:如果没有什么可读,我会继续。但是ReceiveAsync
似乎是唯一接收数据的方法或检查是否有任何数据,如果没有数据,它只是坐在那里并且永远不会完成。
我应该停止使用System.Net.Websockets
并转移到功能更强大的图书馆吗?我发现的所有人都参考了#34;回复"对于客户留言,我不确定它们是否适合我的需求(可能只是一个不好的例子和文档)。