我正在尝试在服务器和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
答案 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