Socket.io连接但没有通信

时间:2014-10-11 22:30:53

标签: node.js sockets socket.io

我在安装了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;
})();

(我这样做是因为它的移动应用程序因此可能没有连接)。我正在使用Brackets和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 

但是我看不到任何传入的消息。在应用程序中,我没有收到任何传入的消息。即使套接字连接成功,我也无法在此环境中进行通信吗?

修改

没有应用程序正在接收从另一方发送的事件。来自节点的日志显示此信息,Chrome中的日志为空。

修改

在Chrome应用中,我收不到console.log("Connected!");。但是我没有收到ERR_CONNECTION_REFUSED错误:我没有收到任何内容。

修改

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

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

由于它是自动连接,并且在连接完成后附加了事件,&#34;已连接&#34;从未到过。但是我还没有在任何应用中收到任何活动。

2 个答案:

答案 0 :(得分:0)

好的,还有一些事情:

首先,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 :(得分:0)

我有一个类似的问题,即服务器发出的事件回调在触发时未触发。我的活动名称是pingpong。我将这些事件重命名后,一切正常。

我怀疑事件名称pingpong由socket.io保留,因此无法使用。