У меня очень простая конфигурация на сервере node с установленным 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 });
Поскольку это было автоматическое подключение, и события были прикреплены после того, как соединение было установлено, «Подключено» так и не было достигнуто. Но я все еще не получаю никаких событий ни в одном приложении.
socket.io
имеет логику автоматического повторного подключения и сообщит об отключении, когда логика повторного подключения истечет? - person jfriend00   schedule 12.10.2014console.log('Connected!!')
что-нибудь выводит на вашу консоль? - person xShirase   schedule 12.10.2014on
слушателей, поэтому я не думал, что это может быть неясно. В любом случае, я собираюсь отредактировать его, чтобы быть более точным, так как вопрос большой, и некоторые вещи могут быть перечитаны при быстром чтении. - person Miquel   schedule 12.10.2014