Я использую 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);
}





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.