我正在开发一个React Native应用程序,我想使用WebSocket类与我的Socket.io服务器进行通信。
我可以很好地连接到服务器,但我在使用.send()
方法向其发送消息时遇到问题。
我在React Native上尝试了这个:
var socket = new WebSocket("ws://host:port/socket.io/?transport=websocket");
socket.onopen = () => {
console.log("connected");
socket.send('data');
};
在我的Socket.io服务器上,我有一个我为测试而创建的监听器:
socket.on('data', function(data) {
console.log("data");
})
连接确实有效,我也可以在服务器上看到它。但是当我socket.send('data')
时,disconnect
事件会在服务器上调用而不是我上面写的data
事件。 (我通过使用函数调用.send()
方法对此进行了测试,因此这会导致服务器断开连接)
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
那是因为Socket.io与WebSocket不完全兼容 - 有初始握手,连接回退(例如,当没有WS可用时,使用AJAX长池或其他技术)以及Socket.io隐藏的其他内容让你的生活更轻松从本质上讲,Socket.io应该被视为一个单独的协议。
要连接到Socket.io服务器,您必须使用Socket.io客户端库。
答案 1 :(得分:1)
ws.send(`42${ JSON.stringify(["message", { command: "register" }] }`), err => {
if (err) console.log("err", err);
});
此代码使用ws pacakge作为示例。
您需要添加42来告诉socoket.io服务器您正在发送消息,{command: "register"}
是您发送的数据,"message"
是socket.io正在侦听的频道。
io.on("message", (data) => {
console.log(data); // => {command: "register"}
});
解释:这是socket.io正在使用的engine.io-protocol。检查它的规格。
最好的解决方案是在两侧使用socket.io或者根本不使用socket.io。