2014-10-11 4 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; 
})(); 

(Я делаю это так, потому что это мобильное приложение, поэтому оно может не иметь связи). Я тестирую его с помощью скобок и Chrome. Сервер и клиент находятся на одной машине. В приложении скрипт загружается нормально, и он подключается к серверу, как я могу это видеть в журнале узел (редактирование: и это все, что я получаю в консоли узла):

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

Edit: в консоли 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 пусты.

EDIT

В приложении Chrome я не получаю console.log("Connected!");. Но ни я не получаю ошибки ERR_CONNECTION_REFUSED: ничего не получаю.

EDIT

мне удалось получить console.log("Connected!"); в приложение путем изменения параметров диспетчера:

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

Как автоматического подключения и события были присоединены после соединения было сделано, «Connected» был никогда не достигал. Но я все равно не получаю никаких событий в любом приложении.

+0

Что вы подразумеваете под "in th e app Я не получаю никакого входящего сообщения "? Вы спрашиваете о клиенте или сервере? И когда вы ожидаете сообщения, когда вы его не получите. Извините, но просто не ясно, о чем именно вы спрашиваете. Знаете ли вы, что клиент 'socket.io' имеет логику автоматического повторного подключения и будет сообщать об отключении, когда логика повторного подключения истекла? – jfriend00

+1

Если вы публикуете вопрос, некоторые зрители находят, что вопрос им непонятен, и они задают уточняющие вопросы, но вы не можете ответить на эти вопросы, тогда вы упустите большинство возможностей, чтобы люди могли ответить на ваш вопрос. Подавляющее большинство людей, которые видят ваш вопрос, будут происходить в первый час после публикации. Если вас нет рядом, чтобы прояснить ситуацию, вы пропустите большинство людей, которые могли бы вам помочь. Это место не работает, как форум, на котором вы отправляете сообщение и возвращаетесь завтра. Ваш вопрос может быть закрыт как «непонятно, что вы спрашиваете». – jfriend00

+0

@ jfriend00 +1 на все, что вы сказали. OP: 'console.log ('Connected !!')' выводит что-нибудь на консоль? – xShirase

ответ

0

Ok, так что несколько вещей:

Во-первых, кажется, не var mSocket быть инициализированы, так что это может быть трудно для того, чтобы излучать() ничего (я отсутствующий что-то?)

Второй , когда вы делаете:

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

сервер рассчитывает получить объект, содержащий message свойства, например: data = {message:'hi server'} в вашем случае, вы посылаете строку, так data является 'Hi server !' и ваш с g скажет «undefined».Вы должны изменить этот бит в:

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

+0

и другие были простыми старыми опечатками;) Я знаю это чувство, рад, что я мог бы как-то помочь – xShirase

Смежные вопросы