2014-10-11 38 views
0

我具有与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 

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

EDIT

没有应用正在接收从对方发送的事件。来自节点的日志显示这一点,从Chrome的日志是空的。

编辑

在Chrome应用程式,我没有收到console.log("Connected!");。但我没有收到ERR_CONNECTION_REFUSED错误:我没有收到任何东西。

编辑

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

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

由于这是自动连接和连接制成后附的事件,“连接”是从未到达。但我仍然没有收到任何应用程序中的任何事件。

+0

你是什么意思“in th e应用程序我没有收到任何传入消息“?你问关于客户端还是服务器?而且,当你没有收到消息时,你什么时候会收到消息?对不起,但目前尚不清楚你究竟在询问什么情况。你是否知道'socket.io'客户端具有自动重新连接逻辑,并且在重新连接逻辑过期时将报告disconnnect? – jfriend00 2014-10-11 22:40:03

+1

如果你发布了一个问题,一些观众发现他们并不清楚问题,他们会问清楚问题,但是你不会回答这些问题,那么你将错过大多数人回答你的问题的机会。大多数看到你的问题的人会在你发布后的第一个小时内发生。如果你不在身边然后澄清事情,你会错过大多数可以帮助你的人。这个地方不像你明天发布和回来的论坛。您的问题可能会因“不清楚您询问的内容”而被关闭。 – jfriend00 2014-10-11 23:33:20

+0

@ jfriend00 +1你说的所有东西。 OP:console.log('Connected !!')'输出什么东西到你的控制台? – xShirase 2014-10-12 00:54:30

回答

0

好了,几件事情:

首先,var mSocket似乎并没有被初始化,所以可能很难为它发出()什么(我这么想吗?)

二当你这样做:

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

服务器预计将收到包含message属性的对象,如:data = {message:'hi server'}在你的情况,你送一个字符串,所以data'Hi server !'和你的LO g会说'未定义'。您应该改变此位为:

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); 

}); 
+0

谢谢!事实上,在1分钟前通过设置'mIoSocket = new io(APP_CFG.baseUrl)解决了问题,正如您所指出的那样,这是问题出在管理器中的事件。 (其他的一些错误是因为这个问题的简化:〜) – Miquel 2014-10-12 08:58:21

+0

和其他人是普通的旧错别字;)我知道这种感觉,很高兴我能以某种方式帮助 – xShirase 2014-10-12 09:00:22

相关问题