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