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;
- 服务器端显式配置CORS规则,避免跨域拦截:
- Android权限与网络配置
- 检查
AndroidManifest.xml,确保添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - Android 9及以上默认禁止明文HTTP请求,需在
<application>标签中添加:
生产环境建议部署HTTPS服务器替代。android:usesCleartextTraffic="true"
- 检查
- IP地址正确性
客户端代码中的ipofmycomputer必须是服务器电脑的局域网真实IP(如192.168.1.100),不能使用localhost或127.0.0.1,物理设备无法解析这些本地回环地址。
内容的提问来源于stack exchange,提问作者Fabrizio Vergaray
相关产品推荐
相关产品推荐

