ios - 带有 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
解决方案
当前版本的 IOS ( socketio/socket.io-client-swift:15.x
) 的套接字 io 客户端库还不支持套接字 io 服务器版本 3.x。
理由:新协议下的默认命名空间声明存在问题。如果启用调试模式,您将看到 Socket 服务器仍然接收来自客户端的消息,但不会触发连接、发射等事件。
解决方案:将您的 NodeJS 套接字 io 服务器版本降级到 2.x 版本
例如:
npm install socket.io@2.0.4
推荐阅读
- eclipse - 一旦我们在 sonarlint 中添加了自定义规则,我们可以再次将代码捆绑为插件吗?如何?
- javascript - 验证画布中的两个形状是否相等
- java - 如何将 TableView 中的 ComboBox 显示到 Google 表格中?
- java - 更新 Spring 存储库的最佳实践
- php - laravel中的groupBy子关系
- c++ - c++中友元函数和聚合的问题
- c++ - C++ 中的文字类型是否可以包含唯一具有带默认值的附加参数的复制构造函数?
- html - 构建tailwindcss配置文件后的问题
- github - 从 puttygen 以 openssh 格式导出 github 可接受的 ssh 密钥
- tensorflow - 如何区分 Tensor 和 EagerTensor