Получение сообщения WebSocket в C#
Очередной кадр читают методом ReceiveAsync.
Вызов заполняет буфер байтами и возвращает
WebSocketReceiveResult. Поле
MessageType показывает текст или
закрытие; Count - сколько байтов
записано в буфер.
Ниже - сценарий со сторонним echo-сервисом при
наличии сети; успешный запуск не гарантируется.
Echo-сервис возвращает текст, который клиент только
что отправил. Отправим "hello-ws", затем
прочитаем ответ в буфер 128 байт и
выведем строку - ожидается "hello-ws":
using System.Net.WebSockets;
using System.Text;
using ClientWebSocket client = new();
using CancellationTokenSource cts = new(TimeSpan.FromSeconds(8));
await client.ConnectAsync(new Uri("wss://echo.websocket.events"), cts.Token);
byte[] send = Encoding.UTF8.GetBytes("hello-ws");
await client.SendAsync(send, WebSocketMessageType.Text, true, CancellationToken.None);
byte[] buffer = new byte[128];
WebSocketReceiveResult result = await client.ReceiveAsync(buffer, CancellationToken.None);
Console.WriteLine(result.MessageType);
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, result.Count));
Строку собирают только по result.Count,
а не по всей длине массива. Поле
EndOfMessage показывает, поместился ли
кадр в буфер целиком:
using System.Net.WebSockets;
using System.Text;
using ClientWebSocket client = new();
using CancellationTokenSource cts = new(TimeSpan.FromSeconds(8));
await client.ConnectAsync(new Uri("wss://echo.websocket.events"), cts.Token);
await client.SendAsync(Encoding.UTF8.GetBytes("ping"), WebSocketMessageType.Text, true, CancellationToken.None);
byte[] buffer = new byte[128];
WebSocketReceiveResult result = await client.ReceiveAsync(buffer, CancellationToken.None);
Console.WriteLine(result.EndOfMessage);
Отправьте "metric" на echo-сервис и
выведите длину полученного текста.