首页 > 解决方案 > 带有 iOS 的 Socket.io 未在移动客户端上连接

问题描述

我正在尝试在服务器和 iOS 客户端之间创建简单的 socket.io 通信。我的服务器代码非常简单:

var io = require('socket.io').listen(1337);

io.sockets.on('connection', function (socket) {
    console.log("Someone just connected!");

    // Echo back messages from the client
    socket.on('image', function (message) {
        console.log("Got image of length: " + message.length);
        socket.emit('image', message);
    });

    socket.on('sound', function (message) {
        console.log("Got sound of length: " + message.length);
        socket.emit('sound', message);
    });

    socket.on('pdf', function (message) {
        console.log("Got pdf of length: " + message.length);
        socket.emit('pdf', message);
    });
});

并遵循以下示例:https ://github.com/socketio/socket.io-client-swift

我已经将我的客户实现为:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupSocketIO()
    }

    func setupSocketIO(){
        let manager = SocketManager(socketURL: URL(string: "http://127.0.0.1:1337/")!, config: [.log(true), .compress])
        let socket = manager.defaultSocket

        socket.on(clientEvent: .connect) {data, ack in
            print("socket connected")
        }

        socket.on("image") {data, ack in
            guard let cur = data[0] as? String else { return }
            print("got image back: ", cur)
        }

        socket.connect()

        socket.emit("image", "sample")
    }
}

运行代码后,行为真的很奇怪,因为在服务器端,我的日志消息Someone just connected!中有,但在客户端没有连接迹象(这意味着,既没有socket connected,也没有sample看到日志中的消息)。

登录 XCode:

SocketIOClient{/}: Adding handler for event: connect
SocketIOClient{/}: Adding handler for event: image
SocketIOClient{/}: Handling event: error with data: ["Tried emitting when not connected"]
SocketIOClient{/}: Handling event: statusChange with data: [connecting, 2]
SocketIOClient{/}: Joining namespace /
SocketManager: Tried connecting socket when engine isn't open. Connecting
SocketManager: Adding engine
SocketManager: Manager is being released
SocketEngine: Starting engine. Server: http://127.0.0.1:1337
SocketEngine: Handshaking
SocketIOClient{/}: Client is being relea2
SocketEnginePolling: Doing polling GET http://127.0.0.1:1337/socket.io/?transport=polling&b64=1
SocketEnginePolling: Got polling response
SocketEnginePolling: Got poll message: 96:0{"sid":"4k2wFGd250H88zmYAAAE","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40
SocketEngine: Got message: 0{"sid":"4k2wFGd250H88zmYAAAE","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}
SocketEngine: Got message: 40
SocketEngine: Writing poll:  has data: false
SocketEnginePolling: Sending poll:  as type: 2
SocketEnginePolling: Created POST string: 1:2
SocketEnginePolling: POSTing
SocketEngine: Engine is being released

标签: iosnode.jsswiftsocket.io

解决方案


当前版本的 IOS ( socketio/socket.io-client-swift:15.x) 的套接字 io 客户端库还不支持套接字 io 服务器版本 3.x。

理由:新协议下的默认命名空间声明存在问题。如果启用调试模式,您将看到 Socket 服务器仍然接收来自客户端的消息,但不会触发连接、发射等事件。

解决方案:将您的 NodeJS 套接字 io 服务器版本降级到 2.x 版本

例如: npm install socket.io@2.0.4


推荐阅读