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

Socket.IO场景下响应码101的含义是什么?传输协议切换问题如何解决

Socket.IO场景下101状态码含义及异常断开解决方案

101状态码的实际含义

HTTP 101 Switching Protocols 是Socket.IO连接过程中的正常响应码,不是错误。Socket.IO默认采用「先HTTP长轮询,再升级为WebSocket」的兼容策略:客户端先发起轮询请求确认服务端可达,之后发送带Upgrade头的HTTP请求申请切换为WebSocket协议,服务端校验通过后就会返回101响应,完成协议切换,后续全双工通信都走WebSocket通道。

你遇到的功能异常和101响应本身无关,核心问题是协议切换过程中/切换后触发了异常断开,才会打印DISCONNECTED USER日志。

可直接落地的修复方案

结合你提供的代码,按以下优先级排查修复:

  • 修复服务端代码的语法缺陷和逻辑缺失
    你当前提供的服务端代码存在两处明显问题:一是disconnect事件监听的回调函数少了闭合括号,二是定义的onConnection连接处理函数没有绑定到Socket.IO实例的connection事件上,会导致连接状态完全没有被正确监听管理。
    修复后的参考代码:
const io = require('socket.io')(http, {
  // 可选配置:调整心跳阈值,减少弱网下误判断开
  pingTimeout: 60000,
  pingInterval: 25000,
  // 可选配置:强制指定传输顺序,避免协议切换波动,要和客户端配置对应
  transports: ['websocket', 'polling']
});

function onConnection(socket){
  console.log("Connected a socket: " + socket.id);
  socket.on('disconnect', function() {
    console.log("DISCONNECTED USER: " + socket.id);
  });
}

// 必须注册连接事件监听
io.on('connection', onConnection);
  • 修复客户端状态赋值的逻辑错误
    你当前在调用connect()方法后立刻将appState.socketIsConnected设为true,但connect()是异步操作,此时连接还没有建立完成,会导致后续业务逻辑状态完全错位。需要把状态赋值逻辑挪到连接成功的回调中,修复后的参考代码:
var socket: SocketIOClient?
var manager: SocketManager? // 你之前的代码漏了manager的属性声明,需要补上避免被释放

func establishConnection(_ completion: (() -> Void)? = nil) {
        let socketUrlString: String = "serverURL"
        self.manager = SocketManager(socketURL: URL(string: socketUrlString)!, config: [
            .log(false), 
            .reconnects(true), 
            .extraHeaders(["header": "customheader"]),
            // 和服务端对应配置传输方式,强制走WebSocket就只留.webSocket
            .transports([.webSocket, .polling])
        ])
        self.socket = manager?.defaultSocket
        self.socket?.connect()
        self.socket?.once(clientEvent: .connect, callback: { (data, emitter) in
            print("\n\n\n connection done!! \n\n\n")
            appState.socketIsConnected = true // 连接成功后再更新状态
            if completion != nil{
                completion!()
            }
        })
        // 可选:监听断开事件,同步更新状态
        self.socket?.on(clientEvent: .disconnect, callback: { [weak self] data, emitter in
            appState.socketIsConnected = false
        })
}
  • 排查版本兼容性问题
    Socket.IO的v2、v3、v4大版本之间互不兼容,如果服务端和客户端的Socket.IO大版本不一致,会直接在协议升级阶段触发断开,表现为返回101响应后立刻打印断开日志,将两端版本对齐到兼容的大版本即可解决。

  • 弱网场景优化
    如果确实是用户网络波动导致的断开,你当前已经配置了.reconnects(true)自动重连,配合服务端的心跳阈值调整,就能大幅降低弱网下的异常断开概率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:57:02