You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:51:17