WebSocket получение большого сообщения

248
04 апреля 2018, 08:05

При получении сообщения от сокета оно обрезается. Получаю примерно 680,000 символов, хотя должно прийти сообщение примерно в 3 раза больше. Мысли кончились, что я делаю не так?

var webSocketClient = new ClientWebSocket();
var cancellationToken = new CancellationToken();
await webSocketClient.ConnectAsync(new Uri("wss://ws-feed.gdax.com"), cancellationToken).ConfigureAwait(false);
if (webSocketClient.State == WebSocketState.Open)
{
    var requestString = JsonConvert.SerializeObject(new
    {
        type = "subscribe",
        product_ids = new[] { "BTC-USD" },
        channels = new[] { "level2", "ticker" }
    });
    var requestBytes = UTF8Encoding.UTF8.GetBytes(requestString);
    var subscribeRequest = new ArraySegment<byte>(requestBytes);
    var sendCancellationToken = new CancellationToken();
    await webSocketClient.SendAsync(subscribeRequest, WebSocketMessageType.Text, true, sendCancellationToken).ConfigureAwait(false);
    while (webSocketClient.State == WebSocketState.Open)
    {
        var receiveCancellationToken = new CancellationToken();
        using (var stream = new MemoryStream(1024 * 1000))
        {
            var receiveBuffer = new ArraySegment<byte>(new byte[128]);
            WebSocketReceiveResult webSocketReceiveResult;
            do
            {
                webSocketReceiveResult = await webSocketClient.ReceiveAsync(receiveBuffer, receiveCancellationToken).ConfigureAwait(false);
                await stream.WriteAsync(receiveBuffer.Array, receiveBuffer.Offset, receiveBuffer.Count);
            } while (!webSocketReceiveResult.EndOfMessage);
            var message = stream.ToArray().Where(b => b != 0).ToArray();
            string str = Encoding.UTF8.GetString(message, 0, message.Length);
            Debug.WriteLine(str);
            break;
        }
    }
}
Answer 1

Докопался до истины: вместо строчки

await stream.WriteAsync(receiveBuffer.Array, receiveBuffer.Offset, receiveBuffer.Count);

надо ставить

await stream.WriteAsync(receiveBuffer.Array, receiveBuffer.Offset, webSocketReceiveResult.Count);

так как иначе вместо чтения сообщения до конца я читаю до конца лишь буфер.

READ ALSO
С# и Excel - Копирование диапазона ячеек в массив

С# и Excel - Копирование диапазона ячеек в массив

Есть xls файл с большим количеством строкИспользую C#, библиотеку interop

224
C# Ошибка во время инициализации элементов объекта

C# Ошибка во время инициализации элементов объекта

ЗдравствуйтеВ программе я создаю несколько классов с наследованием

268
CSS Grid в 2018?

CSS Grid в 2018?

Недавно разобрался в CSS Grid, и понял что это лучшее для меня решение в плане позиционирования элементов

218
Как сделать такой эффект как на скриншоте с эффектом смещения?

Как сделать такой эффект как на скриншоте с эффектом смещения?

Хотелось бы реализовать такой эффект как на скрине :

270