0

我希望我的统一应用程序像服务器一样工作,并读取一些发送给它的 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 () {

    }
}

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

4

2 回答 2

1

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

于 2013-09-27T08:50:54.043 回答
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/

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

于 2013-09-27T09:17:03.047 回答