Godot连接Python本地服务器发送数据失败的解决方法
问题根因
两端使用的传输层协议完全不兼容,是连接失败的核心原因:
- Python服务端通过
socket.SOCK_STREAM创建的是TCP套接字,属于面向连接的流式传输协议,必须完成三次握手建立正式连接后才能收发数据 - Godot端使用的
PacketPeerUDP是UDP协议实现,属于无连接的数据报传输,发往TCP监听端口的UDP数据包会被操作系统内核直接丢弃,不会被TCP服务端识别处理。
修复方案
二选一即可,保证两端协议完全一致。
方案1:统一使用TCP协议(适合需要可靠传输、不丢包的场景)
修正后的Python服务端代码
补全数据接收、连接关闭的逻辑,解决原代码只接受连接不读数据的问题:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 开启端口复用,避免调试时重启服务提示端口占用 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('127.0.0.1', 6000)) s.listen(5) print("TCP服务启动,监听127.0.0.1:6000") while True: clientsocket, address = s.accept() print(f"收到来自 {address} 的连接") # 单次最多接收1024字节数据 recv_data = clientsocket.recv(1024) msg = recv_data.decode("utf-8") print(f"接收数据:{msg}") clientsocket.close() # 收到quit指令退出服务 if msg == "quit": break s.close()
修正后的Godot端代码
替换UDP类为TCP对应的StreamPeerTCP,补全连接状态轮询逻辑:
var socket = StreamPeerTCP.new() # 发起TCP连接请求 if socket.connect_to_host("127.0.0.1", 6000) != OK: print("连接发起失败") return # 轮询等待连接建立,超时时间1秒 var wait_ms = 0 while socket.get_status() == StreamPeerTCP.STATUS_CONNECTING and wait_ms < 1000: socket.poll() OS.delay_msec(50) wait_ms += 50 if socket.get_status() != StreamPeerTCP.STATUS_CONNECTED: print("连接建立失败,状态码:", socket.get_status()) return # 发送字节数据 socket.put_data("quit".to_ascii()) # 等待数据发送完成后断开 OS.delay_msec(100) socket.disconnect_from_host()
方案2:统一使用UDP协议(适合低延迟、允许少量丢包的场景)
修正后的Python服务端代码
替换TCP套接字为UDP套接字,移除TCP专属的监听、连接接受逻辑:
import socket # SOCK_DGRAM参数对应UDP数据报协议 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('127.0.0.1', 6000)) print("UDP服务启动,监听127.0.0.1:6000") while True: # UDP无需建立连接,直接接收数据和发送方地址 recv_data, client_addr = s.recvfrom(1024) msg = recv_data.decode("utf-8") print(f"收到来自 {client_addr} 的数据:{msg}") if msg == "quit": break s.close()
修正后的Godot端代码
原UDP逻辑基本可用,补全基础错误判断即可:
var socket = PacketPeerUDP.new() if socket.set_dest_address("127.0.0.1", 6000) != OK: print("目标地址设置失败") return # 等待套接字初始化完成 OS.delay_msec(50) socket.put_packet("quit".to_ascii()) socket.close()
调试提示
- 必须先启动Python服务端,再运行Godot端的发送逻辑,否则会出现连接被拒绝的错误
- 如果启动Python服务时提示端口占用,先关闭后台残留的Python进程,或更换端口测试
- 两端收发数据时统一使用ASCII/UTF-8编码,避免出现乱码
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

