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

Fre*_*ind 8 javascript websocket socket.io

我有一个非常简单的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');
});
Run Code Online (Sandbox Code Playgroud)

客户端使用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>
Run Code Online (Sandbox Code Playgroud)

但我想使用其他一些websocket客户端来连接服务器,比方说wscat:

npm install -g wscat
wscat ws://localhost:3000
Run Code Online (Sandbox Code Playgroud)

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

error: Error: socket hang up
Run Code Online (Sandbox Code Playgroud)

我的网址ws://localhost:3000是错的吗?如何使它工作?

PS:你可以看到这个项目https://github.com/js-demos/socketio-chat-demo/并尝试一下

Fre*_*ind 20

从Chrome开发工具中,我找到了真正的websocket网址,它应该是:

ws://localhost:3000/socket.io/?EIO=3&transport=websocket
Run Code Online (Sandbox Code Playgroud)

使用此网址与wscat运行良好

  • 这对我有用。你是怎么找到这个的/是否有 ws://localhost:3000 不起作用的原因? (2认同)

Nis*_*ani 5

同意@freewind的回答,我想在细节描述上做得更深一些。

ws://localhost:3000/socket.io/?EIO=3&transport=websocket
Run Code Online (Sandbox Code Playgroud)

该规范可以描述为

+----------------+--------------------+
|      Elm       |        Desc        |
+----------------+--------------------+
| WS             | scheme             |
| localhost:3000 | host               |
| socket.io      | path               |
| EIO=3          | EngineIO version 3 |
| transport      | websocket          |
+----------------+--------------------+
Run Code Online (Sandbox Code Playgroud)

如果传输设置为,websocket则在使用WebSocket协议升级连接时,可以使用任何WebSocket客户端对其进行测试。

我们可以使用Firecamp WebSocket Client轻松地对其进行测试和调试。连接如下图所示。

FirecampSocketIO和WebSocket的GUI客户端。

1. SocketIO

以下屏幕的配置将类似于

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

在此处输入图片说明

2. WebSocket

相同的套接字端点,我们可以使用WebSocket客户端对其进行测试,如下图所示

- WS连接 在此处输入图片说明

- WS提要数据 在此处输入图片说明