我正在编写.Net-Core服务器。每当客户端连接到服务器时,服务器应向连接的客户端广播消息。为了解决这个问题,我编写了一个处理程序,将所有websocket存储在一个列表中。
运行代码时,广播方法将被执行,并调用每个已连接Websocket的SendAsync
方法,但是不知何故,只有最新连接的Websocket才能收到消息。
我已经在不同的窗口中使用Google Chrome的“ Simple Websocket”扩展对服务器进行了测试。
我正在MacOSX上进行编码。
在Startup.cs中配置方法:
app.UseWebSockets();
Handler handler = new Handler();
app.Use(async (context, next) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket client = await context.WebSockets.AcceptWebSocketAsync();
handler.OnConnect(client);
Thread.Sleep(500);
handler.BroadCast("BroadCast me this");
}
});
Handler.cs:
private List<WebSocket> _clients = null;
public Handler()
{
_clients = new List<WebSocket>();
}
public WebSocket OnConnect(WebSocket newClient)
{
_clients.Add(newClient);
return newClient;
}
public void BroadCast(String toSend)
{
byte[] buffer = Encoding.UTF8.GetBytes(toSend);
ArraySegment<byte> segment = new ArraySegment<byte>(buffer, 0, buffer.Count(b => b != 0));
foreach (var client in _clients)
{
if(!client.CloseStatus.HasValue)
client.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
else
Console.WriteLine("Client is closed");
}
}
每个客户端都处于打开状态,它执行SendAsync(我已经调试了外部代码,但是没有抛出异常),但是它不会将消息发送到所有websocket。