如何将Python客户端的socket连接到Node.js/socket.io?
我想把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 个回答
我知道这个话题已经很久了。不过我最近遇到了同样的问题,找不到答案或者类似的问题。所以我来分享一下我的看法。
答案:使用 socket.io 的 Python 版本 python-socketio
为什么 Python 内置的 sockets 或其他 websocket 库无法正常工作,socket.io 的官网上有解释 socket.io。简单来说,socket.io 并不是一个普通的 websocket 连接。虽然他们说内部使用 websockets 进行传输,但连接是通过 HTTP 协议 http://
建立的,而不是 WEBSOCKET 协议 ws://
。这就导致了握手失败,连接无法建立。
你可以试试用循环的方式来获取有效的数据。
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()
然后用你的浏览器访问这个主机和端口来检查一下。
你缺少一个协议或握手过程。你现在的连接只是一个简单的TCP套接字连接。node.js和socket.io是建立在TCP套接字之上的。简单来说,当你连接到一个socket.io服务器时,它期待你使用某种通信协议(比如websockets、长轮询、htmlfile等等)。最开始的握手过程会定义你要用的协议。websockets就是一个被支持的协议之一。这篇博客文章应该能帮到你。实现websockets看起来并不是那么难。