I'm trying to create a TCP client/server program between my PC (python server) and a HoloLens 2 (client). The HoloLens is connected to a hotspot wifi of my PC. The python server sends a message every 10ms. On the HoloLens 2 side, I create a Task that reads the message sent by python, saves it in a variable (this.message), and prints it. The Update function of Unity reads this variable and also prints it.
The client/server exchange works but I obtain a strange behavior. The Update function of Unity sometimes "blocks" on the same value, see the output when I run the program in Debug mode:
...
[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 = , Time.deltaTime = 0,1073922
XRTextureManager::RequestCreateTexture
XRTextureManager::SetupRenderTextureFromXRRequest (id: 4 col: 00000267034FC480 d: 0000000000000000)
RenderTexture::Create (id: 4)
IVRDeviceCallback_CreateEyeTextureResources 00000267034FC480
[UPDATE] msg = , Time.deltaTime = 0,02
[UPDATE] msg = , Time.deltaTime = 0,03958073
[UPDATE] msg = , Time.deltaTime = 0,03671953
[UPDATE] msg = , Time.deltaTime = 0,03492932
[UPDATE] msg = , Time.deltaTime = 0,02845328
[UPDATE] msg = , Time.deltaTime = 0,03497542
[UPDATE] msg = , Time.deltaTime = 0,03212385
[UPDATE] msg = , Time.deltaTime = 0,0251049
[UPDATE] msg = , Time.deltaTime = 0,02491526
[UPDATE] msg = , Time.deltaTime = 0,03330422
[UPDATE] msg = , Time.deltaTime = 0,0285
[UPDATE] msg = , Time.deltaTime = 0,02918776
[UPDATE] msg = , Time.deltaTime = 0,02730698
[UPDATE] msg = , Time.deltaTime = 0,03449469
[UPDATE] msg = , Time.deltaTime = 0,03006713
[UPDATE] msg = , Time.deltaTime = 0,0291826
[UPDATE] msg = , Time.deltaTime = 0,02470792
[UPDATE] msg = , Time.deltaTime = 0,02907375
[UPDATE] msg = , Time.deltaTime = 0,02599656
[UPDATE] msg = , Time.deltaTime = 0,02478719
[UPDATE] msg = , Time.deltaTime = 0,03431208
[UPDATE] msg = , Time.deltaTime = 0,03297156
[UPDATE] msg = , Time.deltaTime = 0,02986411
[UPDATE] msg = , Time.deltaTime = 0,02642448
[UPDATE] msg = , Time.deltaTime = 0,03080849
[UPDATE] msg = , Time.deltaTime = 0,02840208
[UPDATE] msg = , Time.deltaTime = 0,02652443
[UPDATE] msg = , Time.deltaTime = 0,02750953
[UPDATE] msg = , Time.deltaTime = 0,03031938
[UPDATE] msg = , Time.deltaTime = 0,03385823
[UPDATE] msg = , Time.deltaTime = 0,02940964
[UPDATE] msg = , Time.deltaTime = 0,02750875
[UPDATE] msg = , Time.deltaTime = 0,02844969
[UPDATE] msg = , Time.deltaTime = 0,03048833
[UPDATE] msg = , Time.deltaTime = 0,02839474
[UPDATE] msg = , Time.deltaTime = 0,02827193
[UPDATE] msg = , Time.deltaTime = 0,02816344
[Task_reader] msg : 1
[UPDATE] msg = 1, Time.deltaTime = 0,03298781
[UPDATE] msg = 1, Time.deltaTime = 0,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, Time.deltaTime = 0,02866193
[UPDATE] msg = 17, Time.deltaTime = 0,03379974
[UPDATE] msg = 17, Time.deltaTime = 0,02900052
[UPDATE] msg = 17, Time.deltaTime = 0,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, Time.deltaTime = 0,02759542
[UPDATE] msg = 25, Time.deltaTime = 0,02763198
[UPDATE] msg = 25, Time.deltaTime = 0,03485104
[Task_reader] msg : 26
[Task_reader] msg : 27
[Task_reader] msg : 28
[UPDATE] msg = 28, Time.deltaTime = 0,02482302
[UPDATE] msg = 28, Time.deltaTime = 0,02505719
[UPDATE] msg = 28, Time.deltaTime = 0,03322365
[UPDATE] msg = 28, Time.deltaTime = 0,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, Time.deltaTime = 0,03174901
[UPDATE] msg = 37, Time.deltaTime = 0,02485729
[UPDATE] msg = 37, Time.deltaTime = 0,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, Time.deltaTime = 0,03462099
[UPDATE] msg = 44, Time.deltaTime = 0,03412453
[UPDATE] msg = 44, Time.deltaTime = 0,02704797
[UPDATE] msg = 44, Time.deltaTime = 0,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, Time.deltaTime = 0,0302938
[UPDATE] msg = 51, Time.deltaTime = 0,02958437
[UPDATE] msg = 51, Time.deltaTime = 0,02587297
[UPDATE] msg = 51, Time.deltaTime = 0,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, Time.deltaTime = 0,03339917
[UPDATE] msg = 57, Time.deltaTime = 0,02547995
[UPDATE] msg = 57, Time.deltaTime = 0,02404177
[UPDATE] msg = 57, Time.deltaTime = 0,03442656
[UPDATE] msg = 57, Time.deltaTime = 0,03229193
[UPDATE] msg = 57, Time.deltaTime = 0,02541854
[UPDATE] msg = 57, Time.deltaTime = 0,02338453
...
Python side:
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 side: I attached the following c# script to an empty object of my scene.
#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
Any idea how to fix this? Thanks!