Итак, я разработал приложение 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();
И клиент, и сервер работают в разных потоках. И оба они связаны в локальной сети.
Любые отзывы, идеи, комментарии или обновления к этому коду или методу действительно приветствуются!