读取 TCP 数据会冻结 Unity

本文关键字:冻结 Unity 数据 TCP 读取 | 更新日期: 2023-09-27 18:32:57

我希望我的 Unity 应用程序像服务器一样运行并读取发送到它的一些 TCP 字符串。但是,我目前拥有的代码似乎冻结了我的程序,我必须进入任务管理器才能退出。

对TCP连接有更多了解的人可以查看我的代码,看看我做错了什么以及原因是什么?

我的整个班级如下:

public class TCP : MonoBehaviour 
{   
    string ip_address  = "127.0.0.1";
    int port = 22;
    // Use this for initialization
    void Start () 
    {
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var ipAddress = IPAddress.Parse(ip_address);
        EndPoint ep = new IPEndPoint(ipAddress, port);
        socket.Connect(ep);
        while(socket.Connected)
        {
            byte[] bytes = new byte[256];
            int i = socket.Receive(bytes);
            Debug.Log(Encoding.UTF8.GetString(bytes));
        }
    }
    // Update is called once per frame
    void Update () {
    }
}

有一个要求,我对这个主题的了解非常有限,如果您对我如何解决它提出建议,您能否提供一个代码示例,以便我了解如何实现它或链接到我可以阅读的内容以获取更多信息?

读取 TCP 数据会冻结 Unity

socket.Receive(bytes);是一个阻塞调用,这意味着它会让线程进入睡眠状态,直到它收到一些东西。您应该将调用与外部循环一起移动到单独的线程(这样它就不会再阻塞您的主线程),或者使用异步版本 BeginRecieve 并将循环替换为异步模型(查看链接以获取示例)

socket.Receive(bytes)将阻止当前线程。您可以查看异步任务或异步套接字。

byte[] buffer = new byte[count];
socket.BeginReceive(buffer, 0, count, SocketFlags.None, (asyncResult) =>
{
    int bytesRead = socket.EndReceive(asyncResult);
    if(bytesRead == 0)
    {
        // disconnected.
    }
}

下面是一个示例:http://csharp.vanlangen.biz/network-programming/async-sockets/asyncsocketreader/

该示例将读取给定的字节数,然后调用您作为参数传递的操作。