websocket连接总是提示错误 WebSocket connection to 'ws:

用nodejs建立了一个服务端,socket.io+express

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

// app.get('/', function (req, res) {
//     res.sendFile(__dirname + '/index.html');
// });


var usocket = []; //全局变量
io.on('connection', function (socket) {
    console.log('a user connected');

    //监听join事件
    socket.on("join", function (name) {
        usocket[name] = socket
        io.emit("join", name) //服务器通过广播将新用户发送给全体群聊成员
    })

     //监听msg事件
     socket.on("message", function (msg) {
        io.emit("message", msg) //服务器通过广播将新用户发送给全体群聊成员
    })
});

http.listen(3000, function () {
    console.log('listening on *:3000');
});

项目里报错WebSocket connection to 'ws://localhost:3000/' failed: Connection closed before receiving a handshake response

const wsuri = 'ws://localhost:3000';//ws地址
        let ws = new WebSocket(wsuri);
阅读 118.2k
1 个回答

因为socketio夹带了自己的私货,他的ws连接url不是你写的ws//localhost:3000,
并且握手过程中可能有其他的条件参数(猜测)
你需要用到它封装好的socket.io-client
按照你上面的代码,你在浏览器输入http://localhost:8080/socket.io/socket.io.js应该就可以得到一个js文件,使用它来连接服务器。

题外话:
socket.io诞生于那个web刀耕火种的年代,对兼容老旧浏览器做了大量工作。
而这种封装方式,我个人认为是不好的。
首先它对原始的WebSocket进行了侵入,而不是兼容。
其次他的封装程度一方面做不到一个完整的RPC框架,另一方面又让用户无法操作原生对象,显得有些鸡肋。
2020年了,我觉得socketio应该进行一次大的重构,要么精简为原生WebSocket实现,要么往一个具体完整的RPC框架发展。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题