2014-10-11 123 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