【问题标题】:Nodejs server unable to detect connection with Pubnub+SocketIONodejs 服务器无法检测到与 Pubnub+SocketIO 的连接
【发布时间】:2014-06-24 00:10:36
【问题描述】:

我的 nodejs 服务器无法检测到新浏览器何时连接(“连接”事件),我不知道为什么。我在几天内解决了一个问题,并怀疑这是由于添加了在浏览器上实现的 pubnub 套接字连接。

以下是我的server.js

var http    = require('http')
  , connect = require('connect')
  , io      = require('socket.io')
  , fs      = require('fs')
  , uuid    = require('node-uuid')
  , _       = require('lodash');

// pubnub!!! (how to initialize it for use on server)
var pubnub  = require('pubnub').init({
   channel:        "my_channel",
   publish_key:    "pub-key",
   subscribe_key:  "sub-c-key",
   uuid:           "Server",
   origin : 'pubsub.pubnub.com'
});  

pubnub.subscribe({
    channel: 'my_channel',
    callback: function(message) {
      console.log("Message received: ", message);
    },
    message:  'Server ready',
    presence: function(data) {
      console.log("Presense: ", data);
    },
    connect:   publish
});

// various socket.on() events omitted

var app = connect().use(connect.static(__dirname)).use(connect.directory(__dirname));
var server = http.createServer(app);
server.listen(8888);
io = io.listen(server);

io.sockets.on('connection', handleNewPeer);

到达 html 页面后,doConnect(isBroadcaster) 函数从 script 标签运行

doConnect 函数(在 peer.js 中):

var doConnect = function(isBroadcaster) {

  console.log("doConnect");
  // broadcaster or normal peer
  var user;
  if (isBroadcaster) 
    user = "Broadcaster";
  else 
    user = "Viewer";

  (function() {
  var pubnub_setup = {
    channel:       "my_channel",
    publish_key:   "pub-c-key",
    subscribe_key: "sub-c-key",
    user:          user
  };

  // Note removed the var
  socket = io.connect( 'http://pubsub.pubnub.com', pubnub_setup);

 // various socket.on() omitted

 })();

这是之前使用 socketIO 的情况,并且它正在工作:

var doConnect = function(isBroadcaster) {
  socket = io.connect();
// various socket.on() omitted 
}

我的 p2p 视频网站是使用在 Nodejs + SocketIO 服务器上运行的 WebRTC 实现的。 我一直在尝试将 pubnub 合并到其中,并认为这很容易,因为 pubnub 支持 SocketIO(或者至少是客户端?)。真的没想到设置服务器端会这么难。

对此有任何意见吗?我认为这很简单,我无法将手指放在上面

【问题讨论】:

    标签: javascript node.js socket.io webrtc pubnub


    【解决方案1】:

    使用 Node.JS 的服务器上的 Socket.IO

    带有 PubNub 的 Socket.IO 不提供 Node.JS Socket.IO 后端选项。但是,您可以直接将 PubNub SDK 用于连接事件。

    NPM 包

    npm install pubnub
    

    安装 PubNub NPM 后,您可以使用 node.js 服务器后端:

    Node.js 后端代码

    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    // PubNub!!! (how to initialize it for use on server)
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    var pubnub = require('pubnub').init({
       publish_key   : "pub-key",
       subscribe_key : "sub-c-key",
       uuid          : "Server-ID"
    });  
    
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    // On user Connect
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    function on_user_connect(data) {
      console.log( "User Connected: ", data.uuid );
    }
    
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    // On user Leave
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    function on_user_leave(data) {
      console.log( "User Left: ", data.uuid );
    }
    
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    // Open Socket Connection for User Join Events
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    pubnub.subscribe({
        channel  : 'my_channel',
        connect  :   connected
        message  : function(message) {
          console.log("Message received: ", message);
        },
        presence : function(data) {
          if (data.action == "leave")   on_user_leave(data);
          if (data.action == "timeout") on_user_leave(data);
          if (data.action == "join")    on_user_connect(data);
        }
    });
    
    function connected() {
      console.log('connected!');
    }
    

    【讨论】:

    • 嗯这对我来说很不方便,因为我真的只需要服务器在他们点击 html 页面时检测对等点的连接。 pubnub 是否计划添加未来的后端支持?
    • 我尝试使用 pubnub 存在未来,但我仍然需要运行更多测试。现在看来,当服务器运行时,会自动检测到 3 个存在(即使站点上没有人),当有 1 个广播者和 1 个观众时,它们的存在由于某种原因共享相同的 uuid(是 uuid Ip 或 mac 地址基于?)我什至尝试为他们硬编码一个不同的 uuid,但没有运气
    • @JerryFox 再次嗨。是的,您将检测您的服务器作为连接。如果您想排除服务器,您可以将occupancy 减去您认为必要的数字。
    【解决方案2】:

    您使用的是哪个版本的 socket.io?

    这可能无法解决问题。我使用的是版本 1.+ 你试过了吗:

        io.on('connection', function(socket){
            console.log('user connected');
        });
    

    【讨论】:

    • 感谢您的意见!我真的希望这会有所帮助,但似乎问题完全不同
    • 很抱歉。祝你好运。我现在也遇到了一些关于 socket.io 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2022-01-06
    • 2023-03-19
    • 1970-01-01
    • 2021-05-17
    • 2020-02-13
    相关资源
    最近更新 更多