我正在开发一个 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()
方法对此进行了测试,因此这确实会导致服务器断开连接)
有人能解释一下吗?
这是因为 Socket.io 与 WebSocket 并不完全兼容 - 存在初始握手、连接回退(例如,当没有可用的 WS 时,使用 AJAX 长池或其他技术)以及 Socket.io 对您隐藏的其他内容,以使您的生活更轻松。本质上,Socket.io 应该被视为一个单独的协议。
要连接到 Socket.io 服务器,您必须使用 Socket.io 客户端库。
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。
所以我从聊天 gpt 得到这个
Socket.io使用了socket.io和engine.io协议 因此我们需要根据这些协议遵循消息传递模式
因此, 您的第一条消息必须是
40
然后你的socket.io事件消息应该是
42[“事件名称”,“字符串数据”]