【问题标题】:Make two socket connections talk to each other使两个套接字连接互相交谈
【发布时间】:2015-03-06 12:44:35
【问题描述】:

这里是场景...

我正在开发一个我有想法的应用程序,我正在使用 ember 构建它并带有一个 express 后端。我正在使用express-ws,所以我可以更好地在 express 中运行ws websocket 包。我无法让 ws 与 express 一起工作。

我的应用程序将有两个人连接到两个不同的 url,它们是套接字连接,这样他们就可以向服务器发送和接收信息,而另一个人不会得到它。至少我是这么想的。

我想要的是当一个用户通过套接字进行交互时,该套接字将消息发送到另一个套接字以执行操作并将其信息发送给连接到它的用户。

我希望这是有道理的。使用 express-ws 是我迄今为止所做的,它在基本级别上工作。

var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);

app.use(function (req, res, next) {
  console.log('middleware');
  req.testing = 'testing';
  return next();
});

app.get('/', function(req, res, next){
    console.log('browser connected');
  res.send('welcome to the api browser');
});

app.ws('/', function(ws, req) {
  console.log('socket connected');
  var object = {
    message: 'welcome to the socket api',
    time: Date.now().toString()
  }
  ws.send(JSON.stringify(object));
});

app.listen(1337);

我还没有建立另一个连接,但暂时它会是一样的,但是当一个连接上的用户向他们的套接字发送某个消息时,我希望那个套接字执行一些操作然后传递一些数据到另一个套接字,以便它可以向它的用户发送一些信息。

【问题讨论】:

  • 您要做的是存储对每个开放频道的引用,然后收听他们的onmessage 事件

标签: node.js sockets ember.js express


【解决方案1】:

这可能会让您了解如何存储引用以供以后使用:

var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);

// array to hold the connections
var openChannels = [];

app.use(function(req, res, next) {
  console.log('middleware');
  req.testing = 'testing';
  return next();
});

app.get('/', function(req, res, next) {
  console.log('browser connected');
  res.send('welcome to the api browser');
});

app.ws('/', function(ws, req) {
  console.log('socket connected');

  // store connection for later reference
  openChannels.push(ws);

  // @todo: remove from array on disconnect

  // set broadcast callback
  ws.onmessage = function(msg) {
    openChannels.forEach(function(index, item) {
      if (item !== ws) { // make sure we're not sending to ourselves
        item.send(msg);
      }
    });
  };

  var object = {
    message: 'welcome to the socket api',
    time: Date.now().toString()
  }
  ws.send(JSON.stringify(object));
});

app.listen(1337);

【讨论】:

  • 我想我明白了,我是否也可以将每个 app.ws 设置为一个变量名并以相同的方式发送消息,或者它必须是我发送的匿名函数返回的内容发消息给?
  • 您能详细说明您要做什么吗?如果你想将消息从一个用户传递给另一个用户或从一个用户传递到服务器,你必须以某种方式预先识别它们(想想登录)。然后,您可以将套接字绑定到用户身份,这就是我认为您正在尝试做的事情!?
  • 我认为你给出的答案将是我所需要的,我的想法是我真的只需要一种方式让套接字 1 知道它需要在套接字 2 完成后将下一步发送给它的用户步。这有点像每个人都连接到自己的安全套接字上并完成为其他人启动其他步骤的步骤
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多