首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >express.io中的连接客户端

express.io中的连接客户端
EN

Stack Overflow用户
提问于 2014-02-10 17:09:08
回答 2查看 4K关注 0票数 1

我正在用node.js和express.io开发一个简单的聊天应用程序

我想随时显示一个连接的客户端列表(或在线聊天)。

特快专递中,没有明确的方法来“获取”一旦一个新的客户进入房间连接的客户列表,即只有“广播”,而不是“获取”。

以前有人做过这种事吗?

任何线索都会很有帮助。

谢谢!

编辑:

在尝试了@jibsales的答案之后。我想我们快到了。客户端返回给我的不是客户端的实际数组,而是这个:

代码语言:javascript
复制
[ { id: 'OWix3sqoFZAa20NLk304',
namespace: 
 { manager: [Object],
   name: '',
   sockets: [Object],
   auth: false,
   flags: [Object],
   _events: [Object] },
manager: 
 { server: [Object],
   namespaces: [Object],
   sockets: [Object],
   _events: [Object],
   settings: [Object],
   handshaken: [Object],
   connected: [Object],
   open: [Object],
   closed: [Object],
   rooms: [Object],
   roomClients: [Object],
   oldListeners: [Object],
   sequenceNumber: 496205112,
   router: [Object],
   middleware: [],
   route: [Function],
   use: [Function],
   broadcast: [Function],
   room: [Function],
   gc: [Object] },
disconnected: false,
ackPackets: 0,
acks: {},
flags: { endpoint: '', room: '' },
readable: true,
store: { store: [Object], id: 'OWix3sqoFZAa20NLk304', data: {} },
_events: 
 { error: [Function],
   ready: [Function],
   connection: [Function],
   NewChatPrivateLine: [Function],
   NewIdea: [Function],
   NewChatLine: [Function],
   NewPost: [Function] } } ]

这些职能是:

代码语言:javascript
复制
var app = require('express.io')();
app.io.route('connection', function(req) {
  req.io.join(req.data.room);
  var clients = app.io.sockets.clients(req.data.room);
  console.log(clients)
  app.io.room(req.data.room).broadcast('announce', {
    user: req.data.user,
    clients: clients
  }) 
});

这实际上返回一个错误( data = JSON.stringify(ev);TypeError:将循环结构转换为JSON),因为数组有几个循环对象,因此不能广播。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-11 10:31:19

最后,我采用了@Brad提出的“跟踪”解决方案。这不是最优雅的,但是,如果你能帮我改进它,那就太棒了!!

这是最终代码:

服务器端

代码语言:javascript
复制
var app = require('express.io')();

//To broadcast the users online in room sent by the client
var clients = [];
app.io.route('connect', function (req) {
  req.io.leave(req.data.room).on('disconnect', function() {
    //To remove client from list when disconnected
    var index = clients.indexOf(req.data.user);
    if (index > -1) {
      clients.splice(index, 1);
    }
    app.io.room(req.data.room).broadcast('announce', {
      user: req.data.user,
      clients: clients
    }) 
  });
  req.io.join(req.data.room);
  //To avoid repeating the same client with several opened windows/tabs
  var index = clients.indexOf(req.data.user);
  if (index === -1) {
    clients.push(req.data.user); 
  }
  app.io.room(req.data.room).broadcast('announce', {
    user: req.data.user,
    clients: clients
  }) 
});

客户端

代码语言:javascript
复制
// Emit ready event with person name and predefined room for who's online
io.emit('connect', {
  room: room,
  user: user
});

//Get the signal from server and create your list
io.on('announce', function (data){
 //Do awesome stuff with data 
}); 
票数 1
EN

Stack Overflow用户

发布于 2014-02-10 17:33:54

由于express.io只是将expresssocket.io粘合在一起,所以不要忘记查看socket.io的文档。

代码语言:javascript
复制
var clients = io.sockets.clients('room'); // all users from room `room`

不幸的是,express.io是用coffeescript编写的(!)因此,我很难阅读源代码,但是当您需要express.io模块时,socket.io实例也会被挂起:

代码语言:javascript
复制
var express = require('express.io');
var clients = express.io.sockets.clients('room'); // all users from room `room`

如果这不起作用,我会放弃express.io,转而使用express和socket.io进行手动配置,因为看起来express.io有一个非常固执己见的API。实际上,这并不难,因为express.io所做的仅仅是为手动配置创建一个漂亮的接口/抽象(在这个用例中,如果上面的配置不起作用,这实际上会对您造成伤害)。

我还会签出SockJS,因为我(和许多其他websocket使用者)由于缺乏社区支持而放弃了socket.io而改用SockJS。更不用说,当返回到xhr轮询时,IE9中存在严重的内存泄漏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21683565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档