Python Socket连接遭“主动拒绝”问题求助
解决Python Socket连接Unity时的“主动拒绝”错误
遇到"主动拒绝"的错误,本质上是你的Python客户端尝试连接的目标端口(25001)上没有任何服务在监听——说白了就是Unity那边的Socket服务还没启动,或者配置不对。下面是一步步的排查和解决方法:
1. 先确保Unity端的TCP监听服务正常启动
这是最常见的原因!你得先让Unity作为TCP服务器先跑起来,等着Python来连。给你一个极简的Unity C#监听脚本示例,挂在场景里的任意GameObject上:
using System; using System.Net; using System.Net.Sockets; using System.Text; using UnityEngine; public class UnityTCPServer : MonoBehaviour { private TcpListener server; private TcpClient client; private NetworkStream stream; void Start() { // 绑定和Python一致的IP和端口 IPAddress localAddr = IPAddress.Parse("127.0.0.1"); server = new TcpListener(localAddr, 25001); server.Start(); Debug.Log("Unity TCP Server started, waiting for connection..."); // 开启异步接收连接(避免阻塞主线程) server.BeginAcceptTcpClient(OnClientConnected, null); } private void OnClientConnected(IAsyncResult ar) { client = server.EndAcceptTcpClient(ar); stream = client.GetStream(); Debug.Log("Python client connected!"); // 继续监听下一个连接(可选) server.BeginAcceptTcpClient(OnClientConnected, null); // 开始接收数据 byte[] buffer = new byte[1024]; stream.BeginRead(buffer, 0, buffer.Length, OnDataReceived, buffer); } private void OnDataReceived(IAsyncResult ar) { byte[] buffer = (byte[])ar.AsyncState; int bytesRead = stream.EndRead(ar); if (bytesRead > 0) { string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead); Debug.Log("Received from Python: " + receivedData); // 可以给Python回传响应 byte[] response = Encoding.ASCII.GetBytes("Message received!"); stream.Write(response, 0, response.Length); // 继续接收下一批数据 stream.BeginRead(buffer, 0, buffer.Length, OnDataReceived, buffer); } } void OnApplicationQuit() { // 关闭资源 stream?.Close(); client?.Close(); server?.Stop(); } }
2. 严格保证Python和Unity的IP/端口一致
检查你的Python脚本里的host, port = "127.0.0.1", 25001,必须和Unity脚本里的完全匹配——别不小心把端口写成25000或者IP写成192.168.x.x之类的。
3. 绝对要注意启动顺序
先运行Unity项目,等Unity控制台输出"Unity TCP Server started, waiting for connection..."之后,再运行你的Python脚本。如果反过来,Python先跑,Unity还没启动监听,自然会被拒绝连接。
4. 补全你的Python脚本逻辑
你的Python代码没写完,给你补全完整的发送+接收逻辑,确保流程正确:
import socket host, port = "127.0.0.1", 25001 data = "hello from Python" # 创建TCP Socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: # 连接到Unity服务器 sock.connect((host, port)) print(f"Connected to {host}:{port}") # 发送数据(要转成字节) sock.sendall(data.encode('ascii')) # 接收Unity的响应(可选) received = sock.recv(1024).decode('ascii') print(f"Received from Unity: {received}") finally: # 关闭Socket连接 sock.close()
5. 排查防火墙干扰
有时候Windows防火墙会拦截本地的TCP连接,你可以暂时关闭防火墙测试一下,如果能正常连接了,就把Unity编辑器和Python程序加入防火墙的允许列表。
按照上面的步骤来,应该就能解决"主动拒绝"的问题了——核心就是让Unity先开端口等着,Python再去连,别搞反顺序!
内容的提问来源于stack exchange,提问作者rrz0
相关产品推荐
相关产品推荐

