Node.JS WebSocket 和 Socket

Posted

技术标签:

【中文标题】Node.JS WebSocket 和 Socket【英文标题】:Node.JS WebSocket and Socket 【发布时间】:2011-10-07 20:36:07 【问题描述】:

我想混合普通socket和WebSocket两种流。所有收到的套接字消息都应该通过 websocket 广播给所有连接的用户。

我有这部分代码:

var net = require('net');
var io = require('socket.io').listen(13673, 'localhost');

net.createServer(function (stream) 
  stream.setEncoding('utf8');
  stream.on('data', function (data) 
    // HERE SHOULD BE WS BROADCAST
    console.log(data);
  );
).listen(24768);

io.sockets.on('connection', function (socket) 
  socket.on('message', function (text) 
    var message = 
      'type': 'message',
      'received': new Date(),
      'text': text
    ;

    socket.broadcast.json.send([message]);
    socket.json.send([message]);
  );
);

所以,除了它工作得很好,但我想一直收听普通套接字并将接收到的消息处理到 WebSocket。将一个放入另一个不起作用。

【问题讨论】:

【参考方案1】:

尝试保持一个已连接的 WebSocket 客户端数组,当收到 TCP 套接字消息时,循环遍历数组并广播到每个客户端:

var net = require('net');
var io = require('socket.io').listen(13673, 'localhost');

var clients = [];

net.createServer(function (stream) 
    stream.setEncoding('utf8');
    stream.on('data', function (data) 
        // HERE SHOULD BE WS BROADCAST
        for(var i = 0; i < clients.length; i++)
            clients[i].json.send(/*your message*/);
        console.log(data);
    );
).listen(24768);

io.sockets.on('connection', function (socket) 
    clients.push(socket);
);

【讨论】:

这是将所有套接字保存为数组然后循环遍历它们的唯一解决方案吗?性能怎么样? 在出现问题之前不要担心性能。编程的黄金法则。【参考方案2】:

您可以使用 io.sockets.emit 函数向通过 socket.io 连接的套接字进行广播

var express = require('express')
        , app = express()
        , server = require('http').createServer(app)
        , io = require('socket.io').listen(server);

server.listen(80);

io.sockets.on('connection', function (socket) 
    console.log("NEW SOCKET");
);

function sendToBrowser(message)
    io.sockets.emit('news', data: message);

【讨论】:

以上是关于Node.JS WebSocket 和 Socket的主要内容,如果未能解决你的问题,请参考以下文章

Node.js实现WebSocket客户端

为啥选择 XMPP 而 Node.js 和 WebSocket 都可用? [关闭]

WebSocket 错误,意外响应代码:200 与 Nginx 和 Node.js

url 路径中带有通配符的 Node.js 和 Websocket

使用带有弹性 beanstalk、nginx 和 node.js 的 websocket 出现问题

Node.JS、Socket.IO 和集群中的 WebSocket 握手不起作用