Как я могу получить длину входного потока Windows.Storage.Streams.IInputStream?

Я использую HoloLens 2 в качестве клиента и своего сервера Unity на своем ПК. (Подробнее об этом: Как я могу прочитать массив байтов, поступающий с сервера в приложении UWP?) Я потерял отладку await reader1.LoadAsync(256);. Я пробовал все, чтобы получить данные о потоке, но не смог. Я не хочу использовать константное значение для буфера, мне нужен точный размер потока для буфера. Я проверил это, и это работает только и только в том случае, если размер буфера и размер потока данных равны. Или вы можете предложить мне другие подходы?

// Create the StreamSocket and establish a connection to the server.
        using (var streamSocket = new Windows.Networking.Sockets.StreamSocket())
        {
            // The server hostname that we will be establishing a connection to.
            var hostName = new Windows.Networking.HostName(host);

            // client is trying to connect...

            await streamSocket.ConnectAsync(hostName, port);

            // client connected! 

            // Read data from the server.
            using (Windows.Storage.Streams.IInputStream inputStream = streamSocket.InputStream)
            {
                using (var reader1 = new Windows.Storage.Streams.DataReader(inputStream))
                {
                    reader1.InputStreamOptions = Windows.Storage.Streams.InputStreamOptions.ReadAhead;
                    reader1.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    reader1.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;
                    
              
                    // Should be in stream size !!!
                    await reader1.LoadAsync(256);
                    
                    while (reader1.UnconsumedBufferLength > 0)
                    {
                        var bytes1 = new byte[reader1.UnconsumedBufferLength];
                        reader1.ReadBytes(bytes1);

                        // Handle byte array internally!
                        HandleData(bytes1);

                        await reader1.LoadAsync(256);
                    }
                    reader1.DetachStream();
                }
            }
        }
        // close socket
    }
    catch (Exception ex)
    {
        Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

How can I get Windows.Storage.Streams.IInputStream inputStream length?

IInputStream из SteamSocket нельзя искать. Таким образом, мы не можем получить длину пара. Вот почему нам нужно установить буфер для загрузки входного потока все время, пока поток не завершится.

Я проверил код выше, если вы установили InputStreamOptions как ReadAhead. Он сделает следующий шаг, когда буфер 256 заполнится, попробуйте InputStreamOptions как Partial.

reader1.InputStreamOptions = InputStreamOptions.ReadAhead;

Обновлять

Если вы хотите получить длину текущего сообщения перед его загрузкой, мы предлагаем вам записать длину сообщения в виде заголовка сообщения в Steam.

Например

string stringToSend = "PC client uses System.Net.Sockets.TcpClient, System.Net.Sockets.NetworkStream but UWP (HoloLens) uses Windows.Networking.Sockets.StreamSocket.";
var bytes = Encoding.UTF8.GetBytes(stringToSend);
writer.WriteInt32(bytes.Length);
writer.WriteBytes(bytes);

Получить клиента

while (true)
{

    // Read first 4 bytes (length of the subsequent string).
    uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
    if (sizeFieldCount != sizeof(uint))
    {
        // The underlying socket was closed before we were able to read the whole data.
        return;
    }

    // Read the string.
    int bytesLength = reader.ReadInt32();
    uint Actualbytelength = await reader.LoadAsync((uint)bytesLength);
    if (Actualbytelength != bytesLength)
    {
        // The underlying socket was closed before we were able to read the whole data.
        return;
    }

    // Display the string on the screen. The event is invoked on a non-UI thread, so we need to marshal
    // the text back to the UI thread.

    var bytes = new byte[Actualbytelength];
    reader.ReadBytes(bytes);

}
Ответ принят как подходящий

Привет, Нико, извините за позднее обновление. Я пробовал все, но TCP почти невозможен для HoloLens с приложением UWP. Итак, я попробовал UDP, и он отлично работает (https://github.com/mbaytas/HoloLensUDP). Я надеюсь, что в ближайшем будущем Microsoft представит пример TCP для HoloLens 1 и 2.

Другие вопросы по теме