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

React Native应用因java.net.socketException连接重置冻结的排查与解决

我来帮你一步步排查这个问题,结合你用的React Native 0.60.5和socket.io-client 2.3.0版本,这个java.net.socketException: Connection reset通常和Android后台的网络限制、Socket重连机制未正确配置有关,咱们从这几个方向入手解决:

1. 先确认Socket重连机制是否正常工作

socket.io-client 2.x默认是开启重连的,但有时候初始化配置没到位会导致重连失效。检查你的Socket初始化代码,确保开启了核心重连配置:

import io from 'socket.io-client';

// 初始化Socket时显式配置重连参数
const socket = io('你的服务器地址', {
  reconnection: true, // 强制开启重连
  reconnectionAttempts: 10, // 增加重连尝试次数(默认是Infinity,可按需调整)
  reconnectionDelay: 1500, // 首次重连间隔
  reconnectionDelayMax: 6000, // 最大重连间隔
  transports: ['websocket', 'polling'], // 优先用WebSocket,降级到轮询
  timeout: 10000 // 连接超时时间
});

同时,一定要监听重连相关事件,确认重连是否触发:

// 监听重连成功事件
socket.on('reconnect', (attemptNumber) => {
  console.log(`Socket第${attemptNumber}次重连成功`);
  // 这里可以恢复业务逻辑,比如重新订阅之前的事件、同步数据
});

// 监听重连失败事件
socket.on('reconnect_error', (error) => {
  console.error('Socket重连失败:', error);
});

// 监听连接断开原因
socket.on('disconnect', (reason) => {
  console.log(`Socket断开:${reason}`);
  // 如果是io server主动断开(比如server重启),重连会自动触发
});
2. 处理Android后台的网络与进程限制

Android的Doze模式、App Standby以及电池优化会在后台切断应用的网络连接,甚至杀死进程,这是导致Connection reset的常见原因。

监听网络状态变化

用@react-native-community/netinfo(RN0.60+支持自动link)监听网络状态,当网络恢复时主动触发重连:

import NetInfo from '@react-native-community/netinfo';

// 监听网络状态变化
NetInfo.addEventListener((state) => {
  if (state.isConnected && state.isInternetReachable && !socket.connected) {
    console.log('网络恢复,尝试重连Socket');
    socket.connect();
  }
});

申请忽略电池优化权限

在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

然后在React Native端请求该权限(可以用react-native-permissions库):

import Permissions from 'react-native-permissions';

const requestBatteryPermission = async () => {
  const status = await Permissions.request('android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS');
  if (status === 'granted') {
    console.log('已获得忽略电池优化权限,后台网络连接更稳定');
  }
};

// 在应用启动或需要时调用
requestBatteryPermission();
3. 监听应用前后台切换,主动检查连接

当应用从后台/锁屏回到前台时,主动检查Socket连接状态,必要时手动重连:

import { AppState } from 'react-native';

AppState.addEventListener('change', (nextAppState) => {
  // 应用回到前台
  if (nextAppState === 'active') {
    if (!socket.connected) {
      console.log('应用回到前台,Socket未连接,尝试重连');
      socket.connect();
    }
  }
});
4. 检查服务器端Socket配置

服务器端的socket.io 2.2.0也要配合调整,确保跨域、心跳配置合理:

const io = require('socket.io')(server, {
  cors: {
    origin: '*', // 根据实际业务设置允许的域名,不要在生产环境用*
    methods: ['GET', 'POST']
  },
  pingTimeout: 60000, // 心跳超时时间(默认60秒),如果客户端超过这个时间没响应,server会断开连接
  pingInterval: 25000 // 心跳发送间隔(默认25秒)
});

如果服务器端的心跳设置过短,可能会误判客户端离线,导致连接被重置。

5. 补充检查network_security_config

你已经添加了这个配置,但要确认是否符合你的网络环境:
如果你的服务器用的是HTTP协议,必须开启cleartextTrafficPermitted="true";如果是HTTPS,要确保信任对应的证书:

<!-- res/xml/network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 允许HTTP明文传输(仅测试或非生产环境用) -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <!-- 如果是HTTPS,配置特定域名 -->
    <!-- <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">your-production-domain.com</domain>
    </domain-config> -->
</network-security-config>
6. 日志排查定位

在关键节点添加日志,方便你定位问题发生的具体场景:

// 监听Socket核心事件
socket.on('connect', () => console.log('✅ Socket连接成功'));
socket.on('error', (error) => console.error('❌ Socket错误:', error));
socket.on('disconnect', (reason) => console.log('🔌 Socket断开:', reason));

// 监听AppState变化
AppState.addEventListener('change', (state) => console.log('📱 App状态变化:', state));

按照上面的步骤逐一排查,应该能解决应用后台/锁屏回来后的冻结问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:25:00