如何将Python客户端的socket连接到Node.js/socket.io?

4 投票
3 回答
9958 浏览
提问于 2025-04-16 06:29

我想把Blender(版本2.55)通过套接字连接到一个网页。

在网页那边,我可以使用Node.js和socket.io。我之前用过一点Node.js和socket.io,所以我觉得这部分没问题。

现在说到Blender,它是用Python 3.1运行的,我已经有了套接字的基础,如果需要的话我可以添加库。我对Python的套接字还不太熟悉,我能直接把客户端连接到Node.js/socket.io吗?

我试过用Python文档里的基本代码:


import socket
import sys

HOST, PORT = "127.0.0.1", 8080
data = "Hello from Blender"

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to server and send data
sock.connect((HOST, PORT))
sock.send(bytes(data + "\n","utf8"))

# Receive data from the server and shut down
received = sock.recv(1024)
sock.close()

print("Sent:     %s" % data)
print("Received: %s" % received)

结果是:

Sent:     Hello from Blender
Received: b''

看起来Blender是连接上了,但没有收到数据。而且Node也显示没有新的客户端连接……

我还需要其他东西吗?如果有人能帮帮我就好了……

3 个回答

0

我知道这个话题已经很久了。不过我最近遇到了同样的问题,找不到答案或者类似的问题。所以我来分享一下我的看法。

答案:使用 socket.io 的 Python 版本 python-socketio

为什么 Python 内置的 sockets 或其他 websocket 库无法正常工作,socket.io 的官网上有解释 socket.io。简单来说,socket.io 并不是一个普通的 websocket 连接。虽然他们说内部使用 websockets 进行传输,但连接是通过 HTTP 协议 http:// 建立的,而不是 WEBSOCKET 协议 ws://。这就导致了握手失败,连接无法建立。

0

你可以试试用循环的方式来获取有效的数据。

    import socket
    host="127.0.0.1"
    port=8088
    web=socket.socket()
    web.bind((host,port))
    web.listen(5)
    print("recycle")
    while True:
        conn,addr=web.accept()
        data=conn.recv(8)
        print(data)
        conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello world')
        conn.close()

然后用你的浏览器访问这个主机和端口来检查一下。

1

你缺少一个协议或握手过程。你现在的连接只是一个简单的TCP套接字连接。node.js和socket.io是建立在TCP套接字之上的。简单来说,当你连接到一个socket.io服务器时,它期待你使用某种通信协议(比如websockets、长轮询、htmlfile等等)。最开始的握手过程会定义你要用的协议。websockets就是一个被支持的协议之一。这篇博客文章应该能帮到你。实现websockets看起来并不是那么难。

撰写回答