【问题标题】:Socket.io with Swift is not handshaking带有 Swift 的 Socket.io 不是握手
【发布时间】:2020-12-18 04:13:07
【问题描述】:

我正在尝试将 iOS 应用程序与 Node.js WebSocket 服务器集成。 我将 SwiftUI 用于 iOS,将 socket.io 用于服务器和客户端。

但是当我尝试将 iOS 应用程序与服务器连接时, 好像连接不上服务器。

我通过将 React 应用程序连接到 Node.js 服务器来测试服务器是否正在运行 并且连接在浏览器上运行良好。

我检查了 swift 日志,它似乎试图与服务器握手,但是, 它开始长轮询,所以我猜握手过程有一些问题。

如果有新连接,我会在控制台将“新连接”作为字符串记录在 Node.js 服务器中,并且它适用于 React 但不适用于 Swift。

但我没有尝试任何先进的东西,所以我无法找出问题所在。

有人可以帮帮我吗?

import SwiftUI
import SocketIO

final class Service: ObservableObject {
    private var manager = SocketManager(socketURL:URL(string: "http://localhost:5000")!, config: [.log(true), .compress])
    
    init() {
        let socket = manager.defaultSocket
        socket.on(clientEvent: .connect)  { (data,act) in
            print("Connected")
        }
        socket.connect()
    }
}

struct SocketIO: View {
    @ObservedObject var service = Service()
    var body: some View {
        Text("Hello, Web socket!")
    }
}

这是我从 SocketIO-client-swift 得到的日志

2020-12-18 13:08:24.033132+0900 测试[4397:171225] 日志 SocketIOClient{/}:为事件添加处理程序:connect 2020-12-18 13:08:24.033663+0900 测试[4397:171225] LOG SocketIOClient{/}: 处理事件:statusChange with data: [connecting, 2] 2020-12-18 13:08:24.033811+0900 测试[4397:171225] LOG SocketIOClient{/}:加入 命名空间 / 2020-12-18 13:08:24.033930+0900 测试[4397:171225] LOG SocketManager:在引擎未打开时尝试连接套接字。 连接 2020-12-18 13:08:24.034033+0900 测试[4397:171225] LOG SocketManager:添加引擎 2020-12-18 13:08:24.035507+0900 测试 [4397:171427] LOG SocketEngine:启动引擎。服务器: http://localhost:5000 2020-12-18 13:08:24.035608+0900 测试[4397:171427] LOG SocketEngine:握手 2020-12-18 13:08:24.038113+0900 测试[4397:171427] LOG SocketEnginePolling: Doing 轮询 GET http://localhost:5000/socket.io/?transport=polling&b64=1 2020-12-18 13:08:24.125554+0900 测试[4397:171431] [] nw_protocol_get_quic_image_block_invoke dlopen libquic 失败 2020-12-18 13:08:24.166652+0900 测试[4397:171427] 日志 SocketEnginePolling:得到轮询响应 2020-12-18 13:08:24.166801+0900 测试[4397:171427] LOG SocketEnginePolling: Got 投票消息: 0{"sid":"97Fb8N3Ub5ZuRlfHAAAA","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000} 2020-12-18 13:08:24.168076+0900 测试[4397:171427] LOG SocketEngine: 收到消息: 0{"sid":"97Fb8N3Ub5ZuRlfHAAAA","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000} 2020-12-18 13:08:24.171813+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:ping 数据:[] 2020-12-18 13:08:24.171845+0900 测试[4397:171427] LOG SocketEnginePolling: Doing 轮询 GET http://localhost:5000/socket.io/?transport=polling&b64=1&sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.172148+0900 测试[4397:171225] LOG SocketManager: 引擎打开连接 2020-12-18 13:08:24.172267+0900 测试 [4397:171225] LOG SocketIOClient{/}:套接字已连接 2020-12-18 13:08:24.172485+0900 测试[4397:171225] LOG SocketIOClient{/}: 处理事件:statusChange with data: [connected, 3] 2020-12-18 13:08:24.172704+0900 测试[4397:171225] LOG SocketIOClient{/}: 处理事件:连接数据:["/"] 已连接 2020-12-18 13:08:24.174125+0900 测试[4397:171427] LOG SocketEngine:写入 民意调查:有数据:假 2020-12-18 13:08:24.174260+0900 测试 [4397:171427] LOG SocketEnginePolling:发送轮询:作为类型:2 2020-12-18 13:08:24.174607+0900 测试[4397:171427] 日志 SocketEnginePolling:创建的 POST 字符串:1:2 2020-12-18 13:08:24.175188+0900 测试[4397:171427] LOG SocketEnginePolling: 发布 2020-12-18 13:08:24.175708+0900 测试[4397:171427] 日志 SocketEnginePolling:进行轮询 POST http://localhost:5000/socket.io/?transport=polling&b64=1&sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.181566+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:带有数据的 websocketUpgrade: [[“升级”:“websocket”,“连接”:“升级”, “sec-websocket-accept”:“DK4ZA/luKjOL11P+2vm4APQNE5I="]] 2020-12-18 13:08:24.181780+0900 测试[4397:171429] LOG SocketEngineWebSocket: 发送 ws: probe as type: 2 2020-12-18 13:08:24.183557+0900 测试[4397:171431] LOG SocketEnginePolling:得到轮询响应 2020-12-18 13:08:24.183723+0900 测试[4397:171431] 日志 SocketEnginePolling:做轮询 GET http://localhost:5000/socket.io/?transport=polling&b64=1&sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.184529+0900 测试[4397:171427] LOG SocketEngine: 冲洗探针等待 2020-12-18 13:08:24.186620+0900 测试[4397:171428] 错误 SocketEnginePolling:长轮询请求期间出错 2020-12-18 13:08:24.186736+0900 测试 [4397:171428] 错误 SocketEngine:错误 2020-12-18 13:08:24.186892+0900 测试[4397:171225] 错误 SocketManager:错误 2020-12-18 13:08:24.186907+0900 测试[4397:171428] LOG SocketEngine:引擎正在关闭。 2020-12-18 13:08:24.187029+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:数据错误:[“错误”] 2020-12-18 13:08:24.187306+0900 测试[4397:171428] 日志 SocketEnginePolling:创建的 POST 字符串:1:1 2020-12-18 13:08:24.187548+0900 测试[4397:171428] LOG SocketEnginePolling: Doing 投票 POST http://localhost:5000/socket.io/?transport=polling&b64=1&sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.188161+0900 测试[4397:171225] LOG SocketManager: 开始重新连接 2020-12-18 13:08:24.188342+0900 测试[4397:171225] LOG SocketIOClient{/}:处理事件:statusChange 和数据: [连接,2] 2020-12-18 13:08:24.188558+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:重新连接数据:[“错误”] 2020-12-18 13:08:24.188729+0900 测试[4397:171225] LOG SocketManager: 尝试重新连接 2020-12-18 13:08:24.188830+0900 测试[4397:171225] LOG SocketIOClient{/}:处理事件:reconnectAttempt with data: [-1] 2020-12-18 13:08:24.189043+0900 测试[4397:171429] 日志 SocketEngine:启动引擎。服务器:http://localhost:5000 2020-12-18 13:08:24.189113+0900 测试[4397:171225] LOG SocketManager: 计划在 15.068159317825785s 2020-12-18 中重新连接 13:08:24.189439+0900 测试[4397:171429] LOG SocketEngine:握手 2020-12-18 13:08:24.189732+0900 测试[4397:171429] 日志 SocketEnginePolling:做轮询 GET http://localhost:5000/socket.io/?transport=polling&b64=1 2020-12-18 13:08:24.197564+0900 测试[4397:171432] LOG SocketEnginePolling: Got 投票响应 2020-12-18 13:08:24.197690+0900 测试[4397:171432] LOG SocketEnginePolling:得到轮询消息: 0{"sid":"7RPKclRosgovPKY5AAAB","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000} 2020-12-18 13:08:24.197839+0900 测试[4397:171432] LOG SocketEngine: 收到消息: 0{"sid":"7RPKclRosgovPKY5AAAB","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000} 2020-12-18 13:08:24.198569+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:ping 数据:[] 2020-12-18 13:08:24.198587+0900 测试[4397:171432] LOG SocketEnginePolling: Doing 轮询 GET http://localhost:5000/socket.io/?transport=polling&b64=1&sid=7RPKclRosgovPKY5AAAB 2020-12-18 13:08:24.198671+0900 测试[4397:171225] LOG SocketManager: 引擎打开连接 2020-12-18 13:08:24.198848+0900 测试 [4397:171225] LOG SocketIOClient{/}:套接字已连接 2020-12-18 13:08:24.199022+0900 测试[4397:171225] LOG SocketIOClient{/}: 处理事件:statusChange with data: [connected, 3] 2020-12-18 13:08:24.199197+0900 测试[4397:171225] LOG SocketIOClient{/}: 处理事件:连接数据:["/"] 已连接 2020-12-18 13:08:24.199445+0900 测试[4397:171432] LOG SocketEngine:写入 民意调查:有数据:假 2020-12-18 13:08:24.199714+0900 测试 [4397:171432] LOG SocketEnginePolling:发送轮询:作为类型:2 2020-12-18 13:08:24.199973+0900 测试[4397:171432] 日志 SocketEnginePolling:创建的 POST 字符串:1:2 2020-12-18 13:08:24.200257+0900 测试[4397:171432] LOG SocketEnginePolling: 发布 2020-12-18 13:08:24.200524+0900 测试[4397:171432] 日志 SocketEnginePolling:进行轮询 POST http://localhost:5000/socket.io/?transport=polling&b64=1&sid=7RPKclRosgovPKY5AAAB 2020-12-18 13:08:24.205180+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:带有数据的 websocketUpgrade: [[“升级”:“websocket”,“连接”:“升级”, “sec-websocket-accept”:“e5m4DoLk6GlrzUzZSHtQ/n0gXl0="]] 2020-12-18 13:08:24.205309+0900 测试[4397:171429] LOG SocketEngineWebSocket: 发送 ws: probe as type: 2 2020-12-18 13:08:24.207171+0900 测试[4397:171429] LOG SocketEngine:收到消息:3probe 2020-12-18 13:08:24.207420+0900 测试[4397:171429] LOG SocketEngine:已接收 探测响应,应该升级到 WebSockets 2020-12-18 13:08:24.207622+0900 测试[4397:171429] LOG SocketEngine:升级 传输到 WebSockets 2020-12-18 13:08:24.209704+0900 测试 [4397:171429] LOG SocketEnginePolling:发送轮询:作为类型:6 2020-12-18 13:08:24.210114+0900 测试[4397:171225] 日志 SocketIOClient{/}:处理事件:pong with data: [] 2020-12-18 13:08:24.210826+0900 测试[4397:171431] LOG SocketEngine: Flushing 探测等待 2020-12-18 13:08:24.211131+0900 测试[4397:171431] LOG SocketEnginePolling:得到轮询响应 2020-12-18 13:08:24.211279+0900 测试[4397:171431] LOG SocketEngine:切换到 WebSockets 2020-12-18 13:08:24.211500+0900 测试[4397:171431] 日志 SocketEngineWebSocket: 发送 ws: as type: 5 2020-12-18 13:08:24.211974+0900 测试[4397:171431] LOG SocketEngine: Flushing 探测等待

【问题讨论】:

    标签: node.js swift websocket swiftui socket.io-1.0


    【解决方案1】:

    这可能与安全有关。 通常,ios 应用程序期望使用 https 进行连接。要允许 http 连接,请在您的 info.plist 添加这个(临时安全修复):

    <key>NSAppTransportSecurity</key>
    <dict>
    
     <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    

    【讨论】:

    • 感谢您的评论,但我已经编辑了 info.plist。我测试了模拟器是否可以通过路由器从同一 node.js 服务器返回 HTML 代码来连接服务器,我可以从 UIRepresentable WebView 中看到它,所以我认为这与连接本身无关。不过还是谢谢你的回答;)
    • 你可以试试 config: [.forceWebsockets(true), .log(true)])
    • 我通过了 .forceWebsockets(true) 并且似乎日志已更改但仍无法按预期工作打印语句正在触发但它不断出现。似乎它正在尝试连接 WebSocket 而不是轮询,但仍然失败。而且服务器端似乎无法识别连接。
    • 我在github.com/shareup/websocket-apple 尝试过其他框架,例如“Apple Network->NWConnection”和“WebSocket”,它们都在我的测试中运行良好。但例如,我无法让“SocketIO”连接到“wss://echo.websocket.org”。 “SocketIO”常见问题解答说; “这个库不是 WebSockets 库。” “SocketIO”似乎有很多问题,也许有什么东西坏了。
    • 哦是吗?感谢您的信息!我仍然在努力使用 SocketIO,所以它真的帮助了我!如果可能的话,我想使用同一方的框架,但我猜什么工作是最好的。非常感谢:)
    猜你喜欢
    • 2017-06-22
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多