广播到所有Websocket客户端,仅发送到最新连接的客户端

时间:2019-02-16 12:08:33

标签: c# websocket .net-core

我正在编写.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。

0 个答案:

没有答案