问题描述
我正在尝试在我的 PC(python 服务器)和 HoloLens 2(客户端)之间创建一个 TCP 客户端/服务器程序。 HoloLens 连接到我电脑的热点 wifi。 python 服务器每 10 毫秒发送一条消息。在 HoloLens 2 端,我创建了一个 Task,它读取 python 发送的消息,将其保存在一个变量 (this.message) 中,然后打印出来。 Unity 的 Update 函数读取这个变量并打印出来。
客户端/服务器交换工作,但我得到一个奇怪的行为。 Unity 的 Update 函数有时会“阻塞”在同一个值上,当我在 Debug 模式下运行程序时看到输出:
...
[SocketManager] START
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\Windows.Networking.dll'.
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\FirewallAPI.dll'.
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\fwbase.dll'.
[SocketManager] client is trying to connect...
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\wininet.dll'.
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\ondemandConnRouteHelper.dll'.
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\winnsi.dll'.
[UPDATE] msg =,Time.deltaTime = 0,1073922
[SocketManager] client connected
[SocketManager] client sent the request : {0}Hello im the client C#
[SocketManager] T_reader is running
XRTextureManager::RequestCreateTexture
XRTextureManager::SetupRenderTextureFromXRRequest (id: 3 col: 00000267034FEF00 d: 0000000000000000)
RenderTexture::Create (id: 3)
IVRDeviceCallback_CreateEyeTextureResources 00000267034FEF00
[UPDATE] msg =,1073922
XRTextureManager::RequestCreateTexture
XRTextureManager::SetupRenderTextureFromXRRequest (id: 4 col: 00000267034FC480 d: 0000000000000000)
RenderTexture::Create (id: 4)
IVRDeviceCallback_CreateEyeTextureResources 00000267034FC480
[UPDATE] msg =,02
[UPDATE] msg =,03958073
[UPDATE] msg =,03671953
[UPDATE] msg =,03492932
[UPDATE] msg =,02845328
[UPDATE] msg =,03497542
[UPDATE] msg =,03212385
[UPDATE] msg =,0251049
[UPDATE] msg =,02491526
[UPDATE] msg =,03330422
[UPDATE] msg =,0285
[UPDATE] msg =,02918776
[UPDATE] msg =,02730698
[UPDATE] msg =,03449469
[UPDATE] msg =,03006713
[UPDATE] msg =,0291826
[UPDATE] msg =,02470792
[UPDATE] msg =,02907375
[UPDATE] msg =,02599656
[UPDATE] msg =,02478719
[UPDATE] msg =,03431208
[UPDATE] msg =,03297156
[UPDATE] msg =,02986411
[UPDATE] msg =,02642448
[UPDATE] msg =,03080849
[UPDATE] msg =,02840208
[UPDATE] msg =,02652443
[UPDATE] msg =,02750953
[UPDATE] msg =,03031938
[UPDATE] msg =,03385823
[UPDATE] msg =,02940964
[UPDATE] msg =,02750875
[UPDATE] msg =,02844969
[UPDATE] msg =,03048833
[UPDATE] msg =,02839474
[UPDATE] msg =,02827193
[UPDATE] msg =,02816344
[Task_reader] msg : 1
[UPDATE] msg = 1,03298781
[UPDATE] msg = 1,02705432
[Task_reader] msg : 2
[Task_reader] msg : 3
[Task_reader] msg : 4
[Task_reader] msg : 5
[Task_reader] msg : 6
[Task_reader] msg : 7
[Task_reader] msg : 8
[Task_reader] msg : 9
[Task_reader] msg : 10
[Task_reader] msg : 11
[Task_reader] msg : 12
[Task_reader] msg : 13
[Task_reader] msg : 14
[Task_reader] msg : 15
[Task_reader] msg : 16
[Task_reader] msg : 17
[UPDATE] msg = 17,02866193
[UPDATE] msg = 17,03379974
[UPDATE] msg = 17,02900052
[UPDATE] msg = 17,02356422
[Task_reader] msg : 18
[Task_reader] msg : 19
[Task_reader] msg : 20
[Task_reader] msg : 21
[Task_reader] msg : 22
[Task_reader] msg : 23
[Task_reader] msg : 24
[Task_reader] msg : 25
[UPDATE] msg = 25,02759542
[UPDATE] msg = 25,02763198
[UPDATE] msg = 25,03485104
[Task_reader] msg : 26
[Task_reader] msg : 27
[Task_reader] msg : 28
[UPDATE] msg = 28,02482302
[UPDATE] msg = 28,02505719
[UPDATE] msg = 28,03322365
[UPDATE] msg = 28,03319969
[Task_reader] msg : 29
[Task_reader] msg : 30
[Task_reader] msg : 31
[Task_reader] msg : 32
[Task_reader] msg : 33
[Task_reader] msg : 34
[Task_reader] msg : 35
[Task_reader] msg : 36
[Task_reader] msg : 37
[UPDATE] msg = 37,03174901
[UPDATE] msg = 37,02485729
[UPDATE] msg = 37,0258762
[Task_reader] msg : 38
[Task_reader] msg : 39
[Task_reader] msg : 40
[Task_reader] msg : 41
[Task_reader] msg : 42
[Task_reader] msg : 43
[Task_reader] msg : 44
[UPDATE] msg = 44,03462099
[UPDATE] msg = 44,03412453
[UPDATE] msg = 44,02704797
[UPDATE] msg = 44,02687141
[Task_reader] msg : 45
[Task_reader] msg : 46
[Task_reader] msg : 47
[Task_reader] msg : 48
[Task_reader] msg : 49
[Task_reader] msg : 50
[Task_reader] msg : 51
[UPDATE] msg = 51,0302938
[UPDATE] msg = 51,02958437
[UPDATE] msg = 51,02587297
[UPDATE] msg = 51,02565927
[Task_reader] msg : 52
[Task_reader] msg : 53
[Task_reader] msg : 54
[Task_reader] msg : 55
[Task_reader] msg : 56
[Task_reader] msg : 57
[UPDATE] msg = 57,03339917
[UPDATE] msg = 57,02547995
[UPDATE] msg = 57,02404177
[UPDATE] msg = 57,03442656
[UPDATE] msg = 57,03229193
[UPDATE] msg = 57,02541854
[UPDATE] msg = 57,02338453
...
Python 端:
sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
sock.bind(('',4444))
print("[SERVER TCP] Waiting connection ...")
sock.listen(1)
client_socket,address = sock.accept()
data = client_socket.recv(1024)
print(data)
print("[SERVER TCP] Connection done")
x = 0
while True:
x = x + 1
msg = f"{x}\n"
client_socket.send(msg.encode())
sys.stdout.write(msg)
time.sleep(0.01)
HoloLens 2 侧: 我将以下 c# 脚本附加到我场景的一个空对象上。
#if WINDOWS_UWP
using System;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Globalization;
using System.Runtime.InteropServices.WindowsRuntime;
using UnityEngine;
using UnityEngine.XR.WSA;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
public class SocketManager : MonoBehavIoUr
{
string IP = "192.168.137.1";
string PORT = "4444";
Task T_reader;
string message;
readonly object _locker = new object();
void Start()
{
Debug.Log("[SocketManager] START");
this.StartClient();
}
private async void StartClient()
{
try
{
var streamSocket = new Windows.Networking.sockets.StreamSocket();
var hostName = new Windows.Networking.HostName(IP);
Debug.Log("[SocketManager] client is trying to connect...");
await streamSocket.ConnectAsync(hostName,PORT);
Debug.Log("[SocketManager] client connected");
// Send hello to the server.
string request = "Hello im the client C#";
using (Stream outputStream = streamSocket.OutputStream.AsstreamForWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
Debug.Log("[SocketManager] client sent the request : {0}" + request);
T_reader = new Task(
async () =>
{
using (Stream inputStream = streamSocket.InputStream.AsstreamForRead())
{
using (StreamReader streamReader = new StreamReader(inputStream))
{
string tmp;
while (true)
{
tmp = streamReader.ReadLine();
lock (this._locker)
{
this.message = tmp;
Debug.Log("[T_reader] msg : " + this.message);
}
}
}
}
});
T_reader.Start();
Debug.Log("[SocketManager] T_reader is running");
}
catch (Exception ex)
{
Windows.Networking.sockets.socketErrorStatus webErrorStatus = Windows.Networking.sockets.socketError.GetStatus(ex.GetBaseException().HResult);
Debug.Log("[SocketManager] error " + webErrorStatus.ToString());
}
}
void Update()
{
lock (this._locker)
{
Debug.Log("[UPDATE] Msg = " + this.message + ",Time.deltaTime = " + Time.deltaTime);
}
}
void QuitExpe()
{
T_reader.Wait();
Debug.Log("[SocketManager] Stop listening done");
Debug.Log("[SocketManager] Quit experimentation");
UnityEngine.Application.Quit();
}
}
#else
using UnityEngine;
public class SocketManager : MonoBehavIoUr
{
}
#endif
知道如何解决这个问题吗?谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)