iOS上的Socket.io无法在移动客户端上连接

时间:2019-07-03 11:50:04

标签: ios node.js swift 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!,但是在客户端没有任何连接的迹象(也就是说,{ {1}},也看不到日志中的socket connected消息)。

登录XCode:

sample

1 个答案:

答案 0 :(得分:2)

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

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

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

例如: npm install socket.io@2.0.4