使用套接字时发送当前值的Unity延迟

Visual Studio中的client.cs。

private void SendToServer(string HeartRate) { SetHRTest(HeartRate); try { s = client.GetStream(); StreamReader sr = new StreamReader(s); StreamWriter sw = new StreamWriter(s); sw.AutoFlush = true; sw.WriteLine(HeartRate); } finally { if(Environment.HasShutdownStarted) { s.Close(); client.Close(); } } } 

Unity中的server.cs

 using UnityEngine; using System.Collections; using System.Net.Sockets; using System.IO; using System.Net; using System.Threading; public class Server { public static TcpListener listener; public static Socket soc; public static NetworkStream s; static public string CurrentHeartRate = ""; // Use this for initialization public void StartService () { listener = new TcpListener (15579); listener.Start (); for(int i = 0;i < 1;i++){ Thread t = new Thread(new ThreadStart(Service)); t.Start(); Debug.Log("3"); } } void Service () { while (true) { soc = listener.AcceptSocket (); s = new NetworkStream (soc); StreamReader sr = new StreamReader (s); StreamWriter sw = new StreamWriter (s); sw.AutoFlush = true; while(true) { string heartrate = sr.ReadLine (); if(heartrate != null) { CurrentHeartRate = heartrate; Debug.Log(heartrate); } else if (heartrate == null) { break; } } s.Close(); } } void OnApplicationQuit() { Debug.Log ("END"); listener.Stop (); s.Close(); soc.Close(); } } 

更新3:好的,我已经更新了两个脚本。 服务器和客户端连接没有任何问题。 当我检查服务器中的读数时,我能够看到更新的值。 我现在唯一的问题是,延迟。 每次改变心率值时启动客户端方法。 当我将价值设置为标签时,它会向我显示近乎实时的变化。 但是在服务器端,该值需要6秒来跟踪新值(之后已经发送了另一个新值)。 希望有人能澄清原因。

更新4:没关系! 我解决了这个问题。 这是因为每次运行该方法时都会初始化TcpClient。 这造成了延迟。 我把它移到了Forms_Load并注释掉了s.Close()和client.Close()。 延迟变得更少了,差不多接近一秒,我很好。 现在,我只需要找出何时以及如何关闭流和TcpClient。 我正在尝试使用Environment.HasShutdownStarted检查应用程序何时关闭以关闭客户端和流,但它无法正常工作。

更新5:好的,使用https://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit(v=vs.110).aspx修复了最后一期! 全部完成!

我认为你将所有服务器内容都放在了Update中。 这意味着每一帧都会被调用。 这是很多。

您应该将所有这些放在一个单独的方法中,并从客户端调用它。

您正在每帧开始并关闭流。 将ssrsw初始化移动到Start方法,并使用OnApplicationQuit进行关闭。

 void OnApplicationQuit() { s.Close(); soc.Close(); } 

这样做Unity仍然会挂起,因为ReadLine不是异步的,并且将锁定执行,直到您的套接字接收数据。

我能想到的前两种方法是:

  • 使用线程
  • 使用异步回调(我在Unity 3D的UDP服务器中执行)。 看到这个问题: 什么是AsyncCallback?