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

标签 c# sockets tcp unity-game-engine delay

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 秒才能 catch 新值(此时已经发送了另一个新值)。希望有人能解释一下原因。

更新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 修复了最后一个问题!全部完成!

最佳答案

我认为事实上您将所有服务器内容都放在了更新中。这意味着每一帧都会调用它。这是很多。

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

关于c# - 使用套接字时发送当前值的 Unity 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30161845/

相关文章:

c# - 如何将 VC++ 2015 可再发行组件与我的 ClickOnce (.NET) 应用程序捆绑在一起?

c# - 如何告诉 System.Xml.Serialization.XmlSerializer 只序列化基类?

c# - 使用 Windows 身份验证连接到 SQL Server

c - C中的套接字编程

java - 这个 TCP 交互有什么问题?

tcp - 使用 TCP 的信号广播

linux - 各个地方港口的差异

javascript - 无法更改在 UpdatePanel 内创建的 JavaScript 变量

java - 跨网络在java实例之间同步变量

java - 在 ObjectOutputStream 上频繁调用 reset() 可以吗?