用 express-ws 和 socket.io 分别构建 websocket 服务器端有区别吗

2019-07-18 10:32:19 +08:00
 stdying

express-ws 构建的服务,可以用第三方 client 链接发送数据

const express     = require('express');
const app         = express();
const expressWs   = require('express-ws')(app);
const morgan      = require('morgan');
const compression = require('compression');
const serveStatic = require('serve-static');
const basicAuth   = require('basic-auth-connect');

const user = process.env.USER;
const pass = process.env.PASS;

let connects = [];

app.set('port', process.env.PORT || 8080);

if (user && pass) {
  app.use(basicAuth(user, pass));
}

app.use(morgan('dev'));
app.use(compression());
app.use(serveStatic(`${__dirname}/public`));

app.ws('/', (ws, req) => {
  connects.push(ws);

  ws.on('message', message => {
    console.log('Received -', message);
    
    connects.forEach(socket => {
      socket.send(message);
    });
  });
  
  ws.on('close', () => {
    connects = connects.filter(conn => {
      return (conn === ws) ? false : true;
    });
  });
});

app.listen(app.get('port'), () => {
  console.log('Server listening on port %s', app.get('port'));
});

socket.io 构建的服务第三方 client 连接不上,但是 demo 可以发送数据

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')( http);
var port = process.env.PORT || 3000;

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

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

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

刚刚接触,没理解问题出现在哪里

6000 次点击
所在节点    Node.js
4 条回复
x1911
2019-07-18 16:50:00 +08:00
这个是用于什么环境下呢
stdying
2019-07-18 22:26:04 +08:00
@x1911 纯粹测试
pastgift
2019-08-07 23:09:36 +08:00
纯 websocket 相当于就是一个 socket,只要是个 websocket 的客户端就能用
pastgift
2019-08-07 23:14:40 +08:00
socket.io 相当于是 websocket 上层的包装,里面封装了心跳,协议降级(浏览器不支持 websocket 就变 polling )
还有各种「应用级」的封装,比如 namespace, room 什么的,方便广播和管理。
另外还有利用 Redis 来连通多个节点的服务器,相当于 a 客户端连 A 服务器,b 客户端连 B 服务器,但是 a 和 b 之间依然可以经过 Redis 中转之后通讯。

总之用 Socket.IO 好处多多,而且 Socket.IO 也有各个语言 /平台版本的客户端,尽量用起来吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX