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

Socket.io连接异常:模拟器正常但APK无法连接服务器

Socket.io 物理设备无法连接问题

我通过Socket.io搭建了服务器,两个应用在模拟器中可正常连接该服务器,但生成APK后在物理设备上测试时无法连接,且无任何报错信息。相关代码如下:

服务器代码

const express = require('express');
const app = express();
const http = require('http')
const server = http.createServer(app);
const logger = require('morgan');
const cors = require('cors');
const { Server } = require('socket.io')
const io = new Server(server)

const port = process.env.PORT || 3000;
const ordersSockets = require('./sockets/orderSocket');

app.use(logger('dev'));
app.use(express.json());
app.use(cors());

ordersSockets(io)

server.listen(port, () => {
    console.log('application starting ' + process.pid)
})

orderSocket代码

module.exports = (io) => {
    io.on('connection', (socket) => {
        console.log('Client Connect')
        socket.on('disconnect', (data) => {
            console.log('disconnect')
        })
        socket.on('message', (message) => {
            console.log(message)
        })
    })
}

React Native客户端代码

const Test = () => {
    socket.emit('message', message)
}
useEffect(() => {
    socket.connect();
    console.log('----------Connect----------------')
}, []);

工具类代码

import  io  from "socket.io-client";
const socket = io("http://ipofmycomputer:3000");
export default socket;

排查与解决方法

  • 网络连通性验证
    • 确认物理设备与服务器电脑处于同一局域网,用设备浏览器访问http://你的电脑局域网IP:3000,检查是否能正常访问。
    • 检查电脑防火墙设置,确保3000端口允许外部设备访问。
  • Socket.io配置调整
    • 服务器端显式配置CORS规则,避免跨域拦截:
      const io = new Server(server, {
        cors: {
          origin: "*", // 生产环境建议指定具体客户端域名
          methods: ["GET", "POST"]
        }
      });
      
    • 客户端添加错误监听,捕获连接失败细节:
      import io from "socket.io-client";
      
      const socket = io("http://你的电脑局域网IP:3000", {
        transports: ["websocket", "polling"],
        reconnectionAttempts: 5,
        reconnectionDelay: 1000
      });
      
      socket.on("connect_error", (err) => {
        console.error("连接错误:", err);
      });
      
      socket.on("connect_failed", () => {
        console.error("连接失败");
      });
      
      export default socket;
      
  • Android权限与网络配置
    • 检查AndroidManifest.xml,确保添加网络权限:
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
    • Android 9及以上默认禁止明文HTTP请求,需在<application>标签中添加:
      android:usesCleartextTraffic="true"
      
      生产环境建议部署HTTPS服务器替代。
  • IP地址正确性
    客户端代码中的ipofmycomputer必须是服务器电脑的局域网真实IP(如192.168.1.100),不能使用localhost或127.0.0.1,物理设备无法解析这些本地回环地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:32:45