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

时间:2016-09-04 11:16:34

标签: javascript websocket socket.io react-native

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

任何人都可以对此有所了解吗?

2 个答案:

答案 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。