读取 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 () {
}
}
我有一个要求,我对这个主题的了解非常有限,如果您对我如何解决它提出建议,您能否提供一个代码示例,以便我了解如何实现它或链接到我可以阅读的内容以获取更多信息?
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/
该示例将读取给定的字节数,然后调用您作为参数传递的操作。