读取TCP数据会冻结Unity

时间:2013-09-27 08:32:23

标签: c# networking tcp

我希望我的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 () {

    }
}

我有一个请求,我对这个主题的了解是非常有限的,如果你对我如何解决它提出建议,请你提出一个代码示例,以便我可以看到如何实现它或链接到我的东西可以阅读以获取更多信息吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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/

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