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

Electron环境下WebSocket连接ERR_CONNECTION_REFUSED问题求助

问题原因分析与解决方案

你遇到的net::ERR_CONNECTION_REFUSED时好时坏的情况,核心原因是localhost的解析歧义和服务端绑定地址范围的问题,结合Electron(基于Chromium)的网络特性,具体拆解如下:

1. localhost解析的双栈冲突

系统hosts文件中,localhost通常同时映射到IPv4的127.0.0.1和IPv6的::1。你的Python服务初始启动时,可能仅绑定了其中一个协议栈(比如仅IPv4),但Electron/Chromium优先用IPv6解析localhost,导致连接被拒绝;后续可能因为以下原因恢复正常:

  • 服务重启后,websockets库自动绑定了双栈(IPv4+IPv6);
  • Chromium的DNS缓存更新,切换到了IPv4解析localhost;
  • 系统网络配置变化,调整了localhost的解析优先级。

2. 服务端启动时机问题

如果Electron应用先于Python服务完成启动,此时发起WebSocket连接时服务尚未就绪,就会触发连接拒绝。后续服务稳定运行后,再用localhost连接自然成功。

3. 验证与解决方法

方法一:明确服务端绑定地址

修改Python代码,将服务绑定到所有可用网络接口(同时支持IPv4和IPv6),避免解析歧义:

import asyncio
import random
import json
import websockets

async def handler(websocket, path):
    while True:
        data = [random.randint(0, 100) for _ in range(10)]
        await websocket.send(json.dumps(data))
        await asyncio.sleep(1)

# 绑定0.0.0.0监听所有IPv4地址,绑定::监听所有IPv6地址
start_server = websockets.serve(handler, "0.0.0.0", 8000)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

方法二:客户端指定具体IP

在Electron的JS代码中,直接使用127.0.0.1(IPv4)或[::1](IPv6)代替localhost,跳过DNS解析步骤:

useEffect(() => {
  // 用127.0.0.1代替localhost,强制走IPv4
  const socket = new WebSocket('ws://127.0.0.1:8000');

  socket.addEventListener('message', (event) => {
    setData(JSON.parse(event.data));
  });

  // 新增错误监听,方便排查问题
  socket.addEventListener('error', (err) => {
    console.error('WebSocket错误:', err);
  });

  // 组件卸载时关闭连接,避免内存泄漏
  return () => socket.close();
}, []);

方法三:增加连接重试机制

在JS代码中添加连接关闭后的重试逻辑,应对服务未就绪的情况:

useEffect(() => {
  let socket;
  let retryTimer;

  const connect = () => {
    socket = new WebSocket('ws://localhost:8000');
    
    socket.addEventListener('message', (event) => {
      setData(JSON.parse(event.data));
    });

    socket.addEventListener('close', () => {
      // 3秒后重试连接
      retryTimer = setTimeout(connect, 3000);
    });

    socket.addEventListener('error', (err) => {
      console.error('WebSocket错误:', err);
      socket.close();
    });
  };

  connect();

  return () => {
    clearTimeout(retryTimer);
    if (socket) socket.close();
  };
}, []);

内容的提问来源于stack exchange,提问作者Feyto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:01:56