如何使用 WebSocket 向 Socket.io 服务器发送消息

问题描述 投票:0回答:3

我正在开发一个 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()
方法对此进行了测试,因此这确实会导致服务器断开连接)

有人能解释一下吗?

javascript websocket socket.io react-native
3个回答
4
投票

这是因为 Socket.io 与 WebSocket 并不完全兼容 - 存在初始握手、连接回退(例如,当没有可用的 WS 时,使用 AJAX 长池或其他技术)以及 Socket.io 对您隐藏的其他内容,以使您的生活更轻松。本质上,Socket.io 应该被视为一个单独的协议。

要连接到 Socket.io 服务器,您必须使用 Socket.io 客户端库。


2
投票
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。


0
投票

所以我从聊天 gpt 得到这个

Socket.io使用了socket.io和engine.io协议 因此我们需要根据这些协议遵循消息传递模式

  • 40:打开连接
  • 42:表示包含事件的消息

因此, 您的第一条消息必须是

40

然后你的socket.io事件消息应该是

42[“事件名称”,“字符串数据”]

您可以阅读https://socket.io/docs/v4/socket-io-protocol/

© www.soinside.com 2019 - 2024. All rights reserved.