2012-07-28 82 views
4

我試圖用本地客戶端測試一個簡單的socket.io示例。這裏是我的代碼:帶本地客戶端的Socket.io。 Origin null和Access-Control-Allow-Origin

服務器:

var sio = require('socket.io'); 
var io = sio.listen(8077, {log: false}); 

io.sockets.on('connection', function (socket) { 
    console.log('connection detected'); 
    socket.on('hello', function(data){ 
     console.log('hello received: ' + data); 
    }); 
}); 

客戶端:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
    <script src="socket.io-client/dist/socket.io.js" type="text/javascript"></script> 
    </head> 
    <body> 
    <script type="text/javascript"> 
     var socket = io.connect('http://localhost:8077'); 
     if(socket != undefined){ 
      socket.emit('hello', 'this is a test'); 
     } 
    </script> 
    </body> 
</html> 

如果我把我的客戶在遠程服務器中,它運行完美,但如果我嘗試運行從我的客戶本地,我的瀏覽器給我以下錯誤:

XMLHttpRequest cannot load http://localhost:8077/socket.io/1/?t=1343494806858. 
Origin null is not allowed by Access-Control-Allow-Origin 

我知道有一個HTTP頭解決這個問題em在http服務器中,但我不知道在套接字上下文中是否有類似的選項。我需要一個本地客戶端。我不想從一個額外的http nodejs服務器提供客戶端代碼。

+0

我面臨着完全相同的問題,它讓我瘋狂!你能找到解決方案嗎? – Bitsian 2013-03-25 14:44:34

+0

我還沒有解決它。如果您找到解決方案,請告訴我。 – sgmonda 2013-03-25 20:42:13

+0

我也有這個問題。 – 2014-03-17 01:16:21

回答

4

你有沒有嘗試設置服務器的起源參數(它設置你提到的頭)?:

var sio = require('socket.io'); 
var io = sio.listen(8077, {log: false, origins: '*:*'}); 

而且現在你不是本地訪問該服務器,讓你確信更新的訂單:

var socket = io.connect('http://localhost:8077'); 

到包括IP(或域,如果有的話)的遠程服務器:

var socket = io.connect('http://XX.XX.XX.XX:8077'); 

你能看到哪行在控制檯返回錯誤(你使用chrome/ff和螢火蟲?)。在if語句中,套接字變量可能永遠不會被定義。建議使用連接的方式是通過給連接事件附加回調等待它準備就緒,例如:

socket.on('connect', function() { // <-instead of the if 
    socket.emit('hello', 'this is a test'); 
} 
+0

它不起作用。每次運行服務器和客戶端時都會顯示相同的錯誤:原始空值不被允許... – sgmonda 2012-07-28 19:47:04

+0

您是否嘗試過主機名? – paullth 2012-07-28 19:57:56

+0

是的,我試過用我的局域網IP(192.168 ...),但問題仍然存在 – sgmonda 2012-07-29 09:33:36