如何让C#WebSocketClient以持续的容量侦听消息

如何让C#WebSocketClient以持续的容量侦听消息,c#,unity3d,websocket,C#,Unity3d,Websocket,我正在编写一个程序(实际上是Unity中的一个游戏),它应该充当Websocket服务器的客户端,Websocket服务器单独启动并运行 我正在使用System.Net.WebsocketsClientWebSocket。我已经打开了连接,我可以发送消息,但与Javascript客户端不同,在Javascript客户端中,我会设置一个回调函数,每次websocket客户端收到消息时都会运行该回调函数。我很难理解C#API的预期流 下面是我编写的一个消息处理程序: public异步任务Handle

我正在编写一个程序(实际上是Unity中的一个游戏),它应该充当Websocket服务器的客户端,Websocket服务器单独启动并运行

我正在使用
System.Net.Websockets
ClientWebSocket
。我已经打开了连接,我可以发送消息,但与Javascript客户端不同,在Javascript客户端中,我会设置一个回调函数,每次websocket客户端收到消息时都会运行该回调函数。我很难理解C#API的预期流

下面是我编写的一个消息处理程序:

public异步任务HandleMessages(){
使用(var ms=new MemoryStream()){
var messageBuffer=WebSocket.CreateClientBuffer(81928192);
WebSocketReceiveResult结果;
做{
结果=等待ws.ReceiveAsync(messageBuffer,CancellationToken.None);
ms.Write(messageBuffer.Array、messageBuffer.Offset、result.Count);
}
而(!result.EndOfMessage);
if(result.MessageType==WebSocketMessageType.Text){
var msgString=Encoding.UTF8.GetString(ms.ToArray());
Log(msgString);
var message=JsonConvert.DeserializeObject(msgString);
如果(消息[“roomCode”]==roomCode.ToLower()){
//这个消息是给我们的!
Log(“[WS]获得了类型为“+message[“messageType”]”的消息);
}
}
}
}
因此,在最初打开Websocket连接后,如果我将其称为:

wait Task.WhenAll(HandleMessages());
然后它将处理第一条传入消息,但不会处理任何后续消息。我尝试了许多不同的方法,但我不知道如何在每次收到消息时运行此任务


有人知道这件事吗?

事实证明,和往常一样,在这种情况下,有一个很好的用户错误因素

我不理解WebSocket的一些基本概念,所以当我认为我在从服务器广播消息时,实际上只是将它们发送给某些客户端。在Marc Gravell建议的改进和花更多时间修补我的C#客户端代码后,现在看起来是这样的:

public异步任务HandleMessages(){
试一试{
使用(var ms=new MemoryStream()){
while(ws.State==WebSocketState.Open){
WebSocketReceiveResult结果;
做{
var messageBuffer=WebSocket.CreateClientBuffer(1024,16);
结果=等待ws.ReceiveAsync(messageBuffer,CancellationToken.None);
ms.Write(messageBuffer.Array、messageBuffer.Offset、result.Count);
}
而(!result.EndOfMessage);
if(result.MessageType==WebSocketMessageType.Text){
var msgString=Encoding.UTF8.GetString(ms.ToArray());
var message=JsonConvert.DeserializeObject(msgString);
如果(消息[“roomCode”].ToLower()==roomCode.ToLower()){
Log(“[WS]获得了类型为“+message[“messageType”]”的消息);
//这个消息是给我们的!
开关(消息[“消息类型”]){
//在此处处理消息,对stackoverflow不重要
}
}
}
Seek女士(0,SeekOrigin.Begin);
ms.Position=0;
}
}
}捕获(无效操作异常){
Log(“[WS]试图在已经读取消息时接收消息。”);
}
}

一旦我将服务器配置为实际广播我认为正在广播的消息(迭代所有客户端并发送消息),它现在将读取多条消息。再次感谢您的帮助,希望这将有助于将来对WebSocket不熟悉的其他人进行检查

我对WebSocket没有经验,但我认为,
结果。EndOfMessage
表示收到完整消息的时间,当没有可能获得更多数据时,则不会。是的,这意味着该消息的结束。然而,另一条消息(事实上还有更多)将被发送,我需要在它们到达时处理它们,调用
等待ws.ReceiveAsync(…
再次不起作用吗?这会起作用,但WebSocket的目的是在消息发送时接收它们。我如何让整个处理程序作为回调函数运行(或C#ey等效概念)每当从websocket服务器广播消息时,这里似乎只需要一个
while
循环(大概在
ms
范围内,只需确保在循环结束时将
长度和
位置设置回零即可)