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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:00