Вещание всем клиентам Websocket, только отправка последнему подключенному клиенту - PullRequest
0 голосов
/ 16 февраля 2019

Я пишу сервер .Net-Core.Всякий раз, когда клиент подключается к серверу, сервер должен передать сообщение подключенным клиентам.Чтобы решить эту проблему, я написал обработчик, который хранит все веб-сокеты в списке.

Когда я запускаю код, выполняется метод широковещания и он вызывает метод SendAsync для каждого подключенного веб-сокета, но каким-то образомтолько последние подключенные веб-сокеты получают сообщение.

Я тестировал сервер с расширением "Простой веб-сокет" Google Chrome в разных окнах.

Я кодирую на 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 (я отлаживал внешний код, но не было выброшено исключение), но он не отправляет сообщение всем веб-сокетам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...