V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stdying
V2EX  ›  Node.js

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

  •  
  •   stdying · 2019-07-18 10:32:19 +08:00 · 5984 次点击
    这是一个创建于 1736 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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);
    });
    

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

    4 条回复    2019-08-07 23:14:40 +08:00
    x1911
        1
    x1911  
       2019-07-18 16:50:00 +08:00
    这个是用于什么环境下呢
    stdying
        2
    stdying  
    OP
       2019-07-18 22:26:04 +08:00
    @x1911 纯粹测试
    pastgift
        3
    pastgift  
       2019-08-07 23:09:36 +08:00
    纯 websocket 相当于就是一个 socket,只要是个 websocket 的客户端就能用
    pastgift
        4
    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 也有各个语言 /平台版本的客户端,尽量用起来吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3211 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:06 · PVG 21:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.