如何从ws客户端连接到socket.io?

16

我有一个非常简单的socket.io聊天示例,服务器端的代码如下:

https://github.com/js-demos/socketio-chat-demo/blob/master/index.js

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.use(express.static('public'));

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
客户端使用socket io代码连接并运行良好:

https://github.com/js-demos/socketio-chat-demo/blob/master/public%2Findex.html

<script>
  var socket = io();
  $('form').submit(function(){
    socket.emit('chat message', $('#m').val());
    $('#m').val('');
    return false;
  });
  socket.on('chat message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
</script>

但是我想使用其他WebSocket客户端连接服务器,比如说wscat

npm install -g wscat
wscat ws://localhost:3000

但它无法连接,出现以下错误:

error: Error: socket hang up

我的网址 ws://localhost:3000 是不是错了?如何让它工作?

PS:您可以查看此项目https://github.com/js-demos/socketio-chat-demo/并尝试它

2个回答

35

通过 Chrome Dev 工具,我找到了真正的 WebSocket URL,应该是:

ws://localhost:3000/socket.io/?EIO=3&transport=websocket

使用此URL,可以在wscat中正常工作


2
这对我有用。你是怎么发现的呢?/ ws://localhost:3000不起作用,有什么原因吗? - tamj0rd2

14

同意@freewind的回答,我想更详细地描述一下。

ws://localhost:3000/socket.io/?EIO=3&transport=websocket

该规范可被描述为

+----------------+--------------------+
|      Elm       |        Desc        |
+----------------+--------------------+
| WS             | scheme             |
| localhost:3000 | host               |
| socket.io      | path               |
| EIO=3          | EngineIO version 3 |
| transport      | websocket          |
+----------------+--------------------+
如果传输方式设置为websocket,那么它可以通过任何WebSocket客户端进行测试,因为它正在使用WebSocket协议升级连接。 我们可以使用Firecamp WebSocket客户端轻松测试和调试它。 连接将如下图所示。

FirecampSocketIO和WebSocket的GUI客户端。

1. SocketIO

以下屏幕的配置将如下所示

import io from "socket.io-client";
const socket = io( "http://localhost:3000/socket.io", 
 {
  "path": "/socketio",
  "transports": [
    "websocket"
  ]
 }
);

enter image description here

2. WebSocket

同一个 socket 结点,我们可以使用 WebSocket 客户端进行测试,如下图所示:

- WS 连接 enter image description here

- WS 数据传输 enter image description here


当我的应用程序已经部署到 Elastic Beanstalk 上时,我该如何做呢?我将 localhost 替换为我的服务器 IP,但是没有得到任何返回结果,但当我在 localhost 上时它可以工作。@nishchit-dhanani - Nathaniel Babalola
@NathanielBabalola 这很奇怪。你想加入Discord服务器吗?我们可以在那里深入讨论。乍一看可能是CORS问题。https://discord.gg/8hRaqhK - Nishchit
好的,我刚给你发了消息 @nishchit-dhanani - Nathaniel Babalola

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