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

如何在Swift中连接WebSocket?Stream方式添加Token参数咨询

解决WebSocket连接中添加access_token的问题

嘿,我来帮你搞定这个用Stream建立WebSocket连接时添加access_token的问题!

你现在遇到的核心问题是:Stream.getStreamsToHost这个方法只负责建立底层的TCP流连接,它不会帮你处理WebSocket的握手逻辑——而你的access_token需要放在WebSocket连接的URL查询参数里,这得靠手动构建握手请求来实现。

具体解决方案步骤:

  • 先完成基础流连接的初始化(你原来的代码这部分是对的)
  • 手动构建符合WebSocket规范的HTTP握手请求,把access_token嵌入请求路径的查询参数中
  • 将握手请求写入输出流,之后监听输入流确认服务器返回正确的握手响应

修改后的代码示例:

var inputStream: InputStream?
var outputStream: OutputStream?
let host = "link.net"
let port = 8888
let accessToken = "你的实际access_token" // 替换成你真实的token

// 1. 创建并初始化输入输出流
Stream.getStreamsToHost(withName: host, port: port, inputStream: &inputStream, outputStream: &outputStream)

guard let inputStream = inputStream, let outputStream = outputStream else {
    print("无法创建输入/输出流")
    return
}

// 2. 设置代理和调度队列
inputStream.delegate = self
outputStream.delegate = self
inputStream.schedule(in: .main, forMode: .common)
outputStream.schedule(in: .main, forMode: .common)

// 3. 打开流
inputStream.open()
outputStream.open()

// 4. 构建WebSocket握手请求,把token嵌入路径参数
let handshakeRequest = """
GET /ws?token=\(accessToken) HTTP/1.1
Host: \(host):\(port)
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

"""

// 5. 将握手请求写入输出流
if let requestData = handshakeRequest.data(using: .utf8) {
    requestData.withUnsafeBytes { bufferPointer in
        guard let baseAddress = bufferPointer.baseAddress else { return }
        let bytesWritten = outputStream.write(baseAddress.assumingMemoryBound(to: UInt8.self), maxLength: requestData.count)
        if bytesWritten < 0 {
            print("握手请求写入失败:\(outputStream.streamError?.localizedDescription ?? "未知错误")")
        }
    }
}

额外补充说明:

  • Sec-WebSocket-Key是WebSocket握手的必填参数,示例里用了官方测试值,生产环境建议生成随机16字节数据再转成base64格式,更符合规范。
  • 握手完成后,你需要在stream(_:handle:)代理方法里读取服务器响应,确认状态码为101 Switching Protocols,之后才能按照WebSocket帧格式收发数据(这部分需要自己处理帧的编码解码)。
  • 如果觉得手动处理WebSocket帧太繁琐,也可以考虑用成熟的第三方库,它能帮你封装握手和帧处理的细节,你只需要传入带token的完整WebSocket URL即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:42