WinError 10038 尝试对不是套接字的东西进行操作,与 Unity 连接

WinError 10038 an operation was attempted on something that is not a socket, connection with Unity

提问人:YanHem 提问时间:11/15/2023 最后编辑:derHugoYanHem 更新时间:11/15/2023 访问量:39

问:

我正在尝试从 Unity 中具有 TCP 套接字连接的姿态估计程序 (MediaPipe) 发送数据。我在客户端收到错误 10038。

客户端代码:

import socket
import PoseEstimation as pm
import cv2

host, port = "127.0.0.1", 25001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
cap = cv2.VideoCapture(0)
detector = pm.PoseEstimatior()

def sendData(lmString, sock, host, port):
    #sock.connect((host, port))
    sock.send(lmString.encode("utf-8"))
    response = sock.recv(1024).decode("utf-8")
    print(response)
    #sock.close()

while cap.isOpened():
    _, img = cap.read()
    img = detector.findPose(img)
    lmList, complete = detector.getPosition(img)
    lmString = ','.join([','.join(map(str, inner_list)) for inner_list in lmList])
    
    if complete:
        sendData(lmString, sock, host, port)

    cv2.imshow("Image", img)
    
    if cv2.waitKey(1) == ord('q'):
        break
sock.close()
cap.release()
cv2.destroyAllWindows()

这是我的服务器代码。我从Youtube视频中摘取了很大一部分(链接到视频和GitHub代码:https://www.youtube.com/watch?v=Dm0CiAiZk14https://github.com/ConorZAM/Python-Unity-Socket/blob/master/MyListener.cs)

using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
using System.Threading;
using System.Linq;

public class MyListener : MonoBehaviour
{
    Thread thread;
    public int connectionPort = 25001;
    TcpListener server;
    TcpClient client;
    bool running;
    public GameObject[] Body;
    Vector3[] position = Enumerable.Repeat(Vector3.zero, 33).ToArray();

    void Start()
    {
        // Receive on a separate thread so Unity doesn't freeze waiting for data
        ThreadStart ts = new ThreadStart(GetData);
        thread = new Thread(ts);
        thread.Start();
    }

    void GetData()
    {
        // Create the server
        server = new TcpListener(IPAddress.Any, connectionPort);
        server.Start();

        // Create a client to get the data stream
        client = server.AcceptTcpClient();

        // Start listening
        running = true;
        while (running)
        {
            Connection();
        }
        server.Stop();
    }

    void Connection()
    {
        // Read data from the network stream
        NetworkStream nwStream = client.GetStream();
        byte[] buffer = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);

        // Decode the bytes into a string
        string dataReceived = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        // Make sure we're not getting an empty string
        //dataReceived.Trim();
        if (dataReceived != null && dataReceived != "")
        {
            // Convert the received string of data to the format we are using
            position = ParseData(dataReceived);
            nwStream.Write(buffer, 0, bytesRead);
        }
    }

    // Use-case specific function, need to re-write this to interpret whatever data is being sent
    public static Vector3[] ParseData(string dataString)
    {
        Debug.Log(dataString);

        // Split the elements into an array
        string[] stringArray = dataString.Split(',');
        Vector3[] vectors = new Vector3[33];

        for (int i = 0; i < 33; i++)
        {
            float x = float.Parse(stringArray[1 + (i * 4)]) / 100;
            float y = float.Parse(stringArray[2 + (i * 4)]) / 100;
            float z = float.Parse(stringArray[3 + (i * 4)]) / 100;
            vectors[i] = new Vector3(x, y, z);
        }

        return vectors;
    }

    void Update()
    {
        // Set this object's position in the scene according to the position received
        for (int i = 0; i < 33; i++)
        {
            Body[i].transform.localPosition = position[i];
        }
    }
}
python windows unity-game-engine 套接字 oserror

评论

0赞 BugFinder 11/15/2023
你似乎没有打开插座。
0赞 derHugo 11/15/2023
@BugFinder不应该这样做?@OP可以展示服务器端?我想是 Unity c# 代码?有什么东西可能从那一侧关闭插座吗?sock.connect((host, port))
0赞 derHugo 11/15/2023
端口在 Inspector 中仍然匹配?您能确认 Unity 方面现在有异常吗?一般来说,请记住,TCP 没有任何“消息”的概念,它是一个连续流,因此由您决定一种正确的方法来知道何时到达“消息”的末尾(通常您使用固定长度、长度前缀或专用拆分字符)
0赞 derHugo 11/15/2023
我会使用第三方应用程序(例如PacketSender)分别测试这两个部分,以确定问题出在哪一边
0赞 BugFinder 11/15/2023
@derHugo当我发布它时,它被注释掉了。

答: 暂无答案