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

socketio库是否兼容Twilio Media Stream?Sanic服务握手错误求助

Socket.IO与Twilio Media Stream兼容性及握手错误解决方案

兼容性结论

默认情况下Socket.IO库与Twilio Media Stream不兼容。
Socket.IO是基于WebSocket等多种传输协议封装的上层通讯库,有一套自定义的握手、报文分包逻辑,而Twilio Media Stream使用的是标准原生WebSocket协议,二者握手逻辑不匹配,是你遇到31920 Stream - WebSocket - Handshake Error报错的核心原因。

适配解决方法

  • 方案1:单独新增原生WebSocket端点处理Twilio流量
    保留现有Socket.IO服务处理原有业务,在Sanic服务上单独挂载标准WebSocket端点接收Twilio媒体流,二者互不干扰,是最推荐的方案,示例代码如下:

    from sanic import Sanic
    
    app = Sanic("your_app")
    # 原有Socket.IO挂载逻辑保留
    # sio.attach(app)
    
    # 新增Twilio Media Stream专属端点
    @app.websocket("/twilio-stream")
    async def twilio_stream_handler(request, ws):
        while True:
            # 接收Twilio发送的JSON/二进制媒体数据
            payload = await ws.recv()
            # 自行实现音频解析、业务处理逻辑
            await ws.send("ack")
    

    配置Twilio控制台的Media Stream地址为上述端点的ws:///wss://地址即可。

  • 方案2:调整Socket.IO配置适配原生WebSocket
    若必须复用Socket.IO服务承载Twilio流量,可修改Socket.IO启动配置,仅启用纯WebSocket传输模式,关闭自定义握手校验,配置参考如下:

    import socketio
    
    sio = socketio.AsyncServer(
        cors_allowed_origins="*",
        allow_upgrades=True,
        transports=["websocket"], # 仅启用WebSocket传输,关闭长轮询
        ping_timeout=30,
        ping_interval=15
    )
    

    该方案会丢失Socket.IO的弱网降级能力,仅适合网络环境稳定的场景。

快速校验步骤

  • 确认服务已将Twilio的请求域名加入CORS白名单,无跨域拦截
  • 用wscat工具直接测试服务端点,确认可以完成原生WebSocket握手:wscat -c wss://你的服务地址/twilio-stream
  • 确认Twilio控制台配置的Media Stream端点没有Socket.IO特有的路径参数(如/socket.io后缀)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:45:03