Oculus Quest Получение больших данных от TcpClient - PullRequest
1 голос
/ 31 марта 2020

Итак, я разработал приложение C#, которое работает на P C в качестве сервера, оно захватывает рабочий стол P C и отправляет его в виде изображения на другой P C или в этом случае квест Oculus.

При потоковой передаче на другой P C он работает нормально. Но при попытке потоковой передачи к квесту буфер делится на столько частей, что я не могу получить полный образ. Изображение в основном размером 240 Кб, вы можете видеть, что оно не маленькое (это монитор HD).

На стороне сервера (P C) данные отправляются следующим образом:

 AppendTextBox("Waiting for a client..." + Environment.NewLine);
        theOtherClient = meAsServer.AcceptTcpClient();
        AppendTextBox("Connected with " + theOtherClient.Client.RemoteEndPoint.ToString() + Environment.NewLine);

        try {
            NetworkStream srns = theOtherClient.GetStream();
            while (currentProtocol == Protocol.Server) {
                using (Image bmp = CaptureScreen.GetDesktopImage()) {
                    using (MemoryStream ms = new MemoryStream()) {
                        bmp.Save(ms, ImageFormat.Jpeg);
                        byte[] data = ms.ToArray();
                        byte[] dataLen = BitConverter.GetBytes(data.Length);
                        srns.Write(dataLen, 0, dataLen.Length);
                        srns.Write(data, 0, data.Length);
                        AppendTextBox("Image sent in -> " + data.Length.ToString() + " total bytes..." + Environment.NewLine);
                    }
                }

                Thread.Sleep(serverDelay);  // Pause between images...
            }
            AppendTextBox("Closing server...");
            theOtherClient.Close();
            meAsServer.Stop();
        } catch (Exception e) {
            AppendTextBox("Exception: " + e.ToString() + Environment.NewLine);
            theOtherClient.Close();
            meAsServer.Stop();
        }

И клиент (квест) пытается получить такие данные:

meAsClient.Connect(myIP, myPort);

    NetworkStream clns = meAsClient.GetStream();

    byte[] imgInfo = new byte[8];
    List<byte> imgData = new List<byte>();
    meAsClient.ReceiveBufferSize = 65536; 

    while (currentProtocol == Protocol.Client) {

        try {

            if (meAsClient.Available > 0) {

                int dataAmount = clns.Read(imgInfo, 0, meAsClient.Available);
                int dataSize = BitConverter.ToInt32(imgInfo, 0);
                MyDebugWindow.globalMyDebugUpdate("Image Size -> " + dataSize.ToString() + Environment.NewLine);

                imgData.Clear();
                do {
                    byte[] imgBuffer = new byte[meAsClient.Available];
                    dataAmount = clns.Read(imgBuffer, 0, meAsClient.Available);
                    imgData.AddRange(imgBuffer);
                } while (meAsClient.Available > 0);
                MyDebugWindow.globalMyDebugUpdate("Total Data -> " + imgData.Count.ToString() + Environment.NewLine);
                imgData.CopyTo(theImgData);

            }

        } catch (Exception e) {
            MyDebugWindow.globalMyDebugUpdate("Exception: " + e.ToString() + Environment.NewLine);
        }

    }

    meAsClient.Close();

И клиент, и сервер работают в разных потоках. И оба они связаны в локальной сети.

Любые отзывы, идеи, комментарии или обновления к этому коду или методу действительно приветствуются!

...