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

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

有人能给我解释一下吗?


请查看以下的SO问题是否可以将React Native与socket.io结合使用。这也可能会有所帮助如何在React Native中实际使用Socket.io - DavidDomain
@DavidDomain 我尝试了那些方法,但不幸的是,在最新版本的React Native中这是不可能的。或者至少我没能让它工作。https://github.com/socketio/engine.io-parser/pull/55 - Razvan Ilin
2个回答

4

这是因为Socket.io并不完全兼容WebSocket——有初始握手、连接回退(例如当没有WS可用时,使用AJAX长轮询或其他技术)和其他Socket.io隐藏的东西,以使您的生活更轻松。本质上,Socket.io应被视为一种单独的协议。

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


好的,我想那可能是情况。那我会更加努力地尝试让Socket.io与React Native配合工作。 - Razvan Ilin

2
ws.send(`42${ JSON.stringify(["message", { command: "register" }] }`), err => {
   if (err) console.log("err", err);
});

这段代码以ws包为例。
你需要添加42来告诉socket.io服务器你正在发送消息,{command: "register"}是你要发送的数据,"message"是socket.io监听的通道。
io.on("message", (data) => {
  console.log(data); // => {command: "register"}
});

解释:这是socket.io正在使用的engine.io-protocol。请查看其规范。
最佳方案是在两侧都使用socket.io,或者根本不使用socket.io。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接