0

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!

Taevinn
  • 11
  • 2
  • It seems to be due to the varying interval between the `Update` method every time call. Can you try to use [`FixedUpdate`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html) to replace it? – Hernando - MSFT Jul 20 '21 at 05:32
  • Thanks for your help! I've already tried with `FixedUpdate` and I obtained the same result. I also printed `Time.deltaTime` in the `Update` function and I see that it is called every 30-40ms. I also tried without using Unity and the HoloLens, so with a standard UWP TCP client and I obtained the same behavior. I published my issue in a more general discussion here: https://stackoverflow.com/questions/68445887/how-to-avoid-lags-in-a-uwp-tcp-client – Taevinn Jul 20 '21 at 07:21
  • Hi Taevinn, good catch that Unity/HoloLens isn't relevant here and this acts the same in the simpler environment. Since you're getting traction on that version of your question I'd suggest closing this one as a duplicate – Rob Caplan - MSFT Jul 22 '21 at 02:29

0 Answers0