用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);
因为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框架发展。