【问题标题】:Socket.io connected but not communicatingSocket.io 已连接但未通信
【发布时间】:2014-12-06 20:00:56
【问题描述】:

我在安装了 socket.io 的节点服务器中有一个非常简单的配置(有点复杂但基本上像这个):

var main = require('express')();
    server = require('http').createServer(main);
    io = require('socket.io')(server);

io.use(function(socket, next) {
  console.log("middleware!");
  next();
});

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

  socket.on('pong', function (data) {
    console.log(data.message);
  });

  setTimeout(function() {
    console.log("Saying hello");
    socket.emit('ping', { message: 'Hello from server ' + Date.now() });

  }, 1000);

});

server.listen(2080, function onCreateServerMain() {
  console.log('Server main is listening on port 2080';
  console.log('************************************************************');
});

在客户端:

var socketIoScript,
    loadSocketTimeout,
    trialsToLoadSocketIo = 0,
    APP_CFG = {baseUrl : "http://192.168.1.13:2080"};

function loadSocketIo(socketIoIp) {
  socketIoScript = document.createElement('script');
  socketIoScript.setAttribute('src', socketIoIp);
  socketIoScript.setAttribute('onload', 'onSocketLoaded();');
  document.head.appendChild(socketIoScript);
}

window.onSocketLoaded = function onSocketLoaded() {
  if (typeof(io.connect) === 'function') {
    var mSocket,
        mIoSocket;

    $timeout.cancel(loadSocketTimeout);
    mIoSocket = new io.Manager(APP_CFG.baseUrl);

    mIoSocket.connect(function(socket) {
      console.log('Connected!!');
    });
    mIoSocket.on('error', function onSocketError(e) {
      console.log('WebSocket Error ' + error);
    });

    mIoSocket.on('ping', function onPingReceived(e) {
      console.log('Server emitted ping: ' + e.data);
      mSocket.emit('pong', 'hi server!');
    });
  }
}

~(function onLoadSocketTimeout() {
  var nextTimeout;

  if (trialsToLoadSocketIo < 10) {
    nextTimeout = 5000;
  } else if (trialsToLoadSocketIo > 60) {
    nextTimeout = 60000;
  } else {
    nextTimeout = 1000 * trialsToLoadSocketIo;
  }

  if (socketIoScript) {
    document.head.removeChild(socketIoScript);
  }

  loadSocketIo(APP_CFG.baseUrl + '/socket.io/socket.io.js#' + trialsToLoadSocketIo);
  loadSocketTimeout = $timeout(onLoadSocketTimeout, nextTimeout);
  trialsToLoadSocketIo += 1;
})();

(我这样做是因为它是移动应用程序,所以它可能没有连接)。我正在使用括号和 Chrome 对其进行测试。服务器和客户端在同一台机器上。在应用程序中,脚本加载正常,它连接到服务器,正如我在节点日志中看到的那样(编辑:这就是我在节点控制台中得到的全部内容):

Server main is listening on port 2080
************************************************************
middleware!
connected...
Saying hello

编辑:在 Chrome 控制台中,我没有收到任何消息,并且任何断点在 on 侦听器处停止。如果我停止节点,Chrome 的控制台立即开始记录它已断开连接:

GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066902601-6 net::ERR_CONNECTION_REFUSED 
GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066906606-7 net::ERR_CONNECTION_REFUSED 

但我看不到任何传入消息。在应用程序中,我没有收到任何传入消息。有什么原因导致即使socket连接成功我也无法在这种环境下通信?

编辑

没有应用接收从另一端发送的事件。来自节点的日志显示了这一点,来自 Chrome 的日志是空的。

编辑

在 Chrome 应用程序中,我没有收到 console.log("Connected!");。但我都没有收到ERR_CONNECTION_REFUSED 错误:我什么也没收到。

编辑

我通过更改管理器选项设法在应用程序中获得console.log("Connected!");:

  mIoSocket = new io.Manager(APP_CFG.baseUrl, { autoConnect: false });

由于它是自动连接,并且在连接后附加了事件,因此从未达到“已连接”。但我仍然没有在任何应用程序中收到任何事件。

【问题讨论】:

  • “在应用程序中我没有收到任何传入消息”是什么意思?你问的是客户端还是服务器?而且,当您没有收到消息时,您何时期待消息。抱歉,但目前尚不清楚您要问的具体情况。您是否知道socket.io 客户端具有自动重新连接逻辑,并且在重新连接逻辑到期时会报告断开连接?
  • 如果你发布一个问题,一些观众发现问题对他们来说不清楚,他们会提出澄清问题,但你不在身边回答这些问题,那么你将错过大部分机会人来回答你的问题。大多数看到您的问题的人会在您发布后的第一个小时内发生。如果你不在场澄清事情,你会想念大多数可以帮助你的人。这个地方不像论坛那样工作,您可以在其中发布并明天回来。您的问题可能会以“不清楚您在问什么”而结束。
  • @jfriend00 +1 你所说的所有内容。 OP:console.log('Connected!!') 是否向您的控制台输出任何内容?
  • 投票结束时“不清楚你在问什么”,因为问题不清楚,并且 OP 没有回应澄清的呼吁。
  • @jfriend00 你说得对,我得走了。没有应用程序从彼此获取事件。日志中没有来自on 听众的日志,所以我认为这可能不清楚。无论如何,我将对其进行编辑以使其更精确,因为问题很大,并且某些内容可能会在快速阅读中被过度阅读。

标签: node.js sockets socket.io


【解决方案1】:

好的,有几件事:

首先,var mSocket 似乎没有被初始化,所以它可能很难发出任何东西(我错过了什么吗?)

其次,当你这样做时:

socket.on('pong', function (data) {
    console.log(data.message);
});

服务器期望接收一个包含message 属性的对象,例如:data = {message:'hi server'} 在你的情况下,你发送一个字符串,所以data 是'Hi server !',你的日志会说'未定义'。您应该将此位更改为:

socket.on('pong', function (data) {
    console.log(data);
});

反过来你也有类似的问题,你发送一个对象:{ message: 'Hello from server ' + Date.now() },并试图记录一个不存在的data 属性。将此位更改为:

  console.log('Server emitted ping: ' + e.message);

第三,你必须监听套接字上的事件,而不是“管理器”

客户:

mIoSocket.connect(function(socket) {
    console.log('Connected!!');
    socket.emit('pong');

    socket.on('error', function onSocketError(e) {
        console.log('WebSocket Error ' + error);
    });

    socket.on('ping', function onPingReceived(e) {
        console.log('Server emitted ping: ' + e.data);
        socket.emit('pong', 'hi server!');
    });
});

服务器:

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

  socket.on('pong', function (data) {
    console.log(data);
  });

  setTimeout(function() {
    console.log("Saying hello");
    socket.emit('ping', { message: 'Hello from server ' + Date.now() });

  }, 1000);

});

【讨论】:

  • 谢谢!事实上,1 分钟前通过设置 mIoSocket = new io(APP_CFG.baseUrl); 解决了问题,正如您所指出的,在管理器中监听事件。 (其中一些错误是因为问题的简化:~)
  • 和其他人都是老错字;)我知道这种感觉,很高兴我能以某种方式提供帮助
【解决方案2】:

我有一个类似的问题是服务器上的事件回调在发射时没有触发。我的活动名称是 ping 和 pong。一旦我重命名这些事件,一切都正常了。

我怀疑事件名称ping 和pong 被socket.io 保留,因此无法使用。

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多