Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于图像流和纹理2D错误的TCP套接字通信_C#_Python_Unity3d_Tcp - Fatal编程技术网

C# 用于图像流和纹理2D错误的TCP套接字通信

C# 用于图像流和纹理2D错误的TCP套接字通信,c#,python,unity3d,tcp,C#,Python,Unity3d,Tcp,我想问一下为什么会发生这种错误 首先,让我向您展示服务器 字符串消息=“1”; byte[]buff=Encoding.ASCII.GetBytes(消息); stream.Write(buff,0,buff.Length);//将字节流花费到流中 //_客户端(0) { //이미지 크기 생성 이후 流动되는 이미지 크기에 맞게 수정 해야함 纹理2d纹理=新纹理2d(640480); //字节형식의 데이터를 纹理2d형식으로 읽음 bool load=texture.LoadImage(

我想问一下为什么会发生这种错误
首先,让我向您展示服务器 字符串消息=“1”; byte[]buff=Encoding.ASCII.GetBytes(消息); stream.Write(buff,0,buff.Length);//将字节流花费到流中 //_客户端(0) { //이미지 크기 생성 이후 流动되는 이미지 크기에 맞게 수정 해야함 纹理2d纹理=新纹理2d(640480); //字节형식의 데이터를 纹理2d형식으로 읽음 bool load=texture.LoadImage(图像); 如果(加载) { //이미지를 화면에 입힘(帆布아래 原始图像) instance.rawimage.texture=纹理作为纹理; //이미지 가로 세로 비율 instance.fit.aspectRatio=640/480; } } } #端区 //在第一帧更新之前调用Start 无效唤醒() { 实例=此; } //每帧调用一次更新 无效更新() { //显示图像(instance.imageToDisplay); } } }
问题在于,您将read函数移动到update中,后者调用Unity中的每一帧,因此您无法捕获接收数据

解决办法是:

void Start()
{
    Debug.Log("*****Unity frame started *****");

    ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    ipAddress = ipHostInfo.AddressList[1];

    client_sock = new TcpClient(ipAddress.ToString(), PORT);
    Debug.Log("***** Client Connected to the server *****");

    stream = client_sock.GetStream(); 
    StartReceiveFunction();
}

void StartReceiveFunction()
{
    // Can be Application.IsRunning or whatever bool you need to receive data
    while (true)
    {
         if(stream.CanRead && client_sock.ReceiveBufferSize > 0){
         bytes = new byte[client_sock.ReceiveBufferSize];
         stream.Read(bytes, 0, client_sock.ReceiveBufferSize);             
         Viewer.instance.SetImageToDisplay(image);
    }       
}

好的,我找到问题并解决了
问题在于TCP服务器的错误实现

我更改了python服务器代码,如下所示:

类MyTCPHandler(socketserver.BaseRequestHandler): 队列=机柜队列 stringData=str() def句柄(自身): #“self.request”是连接到客户端的TCP套接字 打印(“通过以下方式连接的客户端:”,self.client\u地址[0],“:”,self.client\u地址[1]) 尽管如此: 尝试: #_服务器客户端 #打印(str(len(MyTCPHandler.stringData)).ljust(16.encode())#.ljust(16)并编码到
###self.request.sendall(str(len(MyTCPHandler.stringData)).ljust(16.encode())#感谢您的评论。事实上,我也尝试过用这种方法删除
update()
函数,并在
过程中执行
循环以接收缓冲区,但unity过程在这种形式下暂停。这就是为什么我添加了
update()
function…我对
update()
function有一个问题(我真的是Unity的初学者)。如果我在
update()
处调用另一个函数,这是由子线程调用的另一个函数吗?主线程是否继续执行下一个
update()
frame?每一帧都在主线程上执行更新。所以在你的应用程序中,我想你应该下载到另一个线程中,然后在main上设置image