2013-07-11 132 views
1

我有一個使用socket.io的遊戲。當通過我自己的計算機連接時,在本地和通過我的IP地址(不是局域網,而是真正的IP)播放時,它工作正常。通過IP地址不能正常工作的Socket.io連接

但是,當我給我的IP和端口給別人時,索引HTML頁面加載得很好,但socket.io'連接'不起作用。

它在socket.io.js的第1659行顯示錯誤。

Socket.prototype.handshake = function (fn) { 
var self = this 
    , options = this.options; 

function complete (data) { 
    if (data instanceof Error) { 
    self.connecting = false; 
    self.onError(data.message); 
    } else { 
    fn.apply(null, data.split(':')); 
    } 
}; 

var url = [ 
     'http' + (options.secure ? 's' : '') + ':/' 
    , options.host + ':' + options.port 
    , options.resource 
    , io.protocol 
    , io.util.query(this.options.query, 't=' + +new Date) 
    ].join('/'); 

if (this.isXDomain() && !io.util.ua.hasCORS) { 
    var insertAt = document.getElementsByTagName('script')[0] 
    , script = document.createElement('script'); 

    script.src = url + '&jsonp=' + io.j.length; 
    insertAt.parentNode.insertBefore(script, insertAt); 

    io.j.push(function (data) { 
    complete(data); 
    script.parentNode.removeChild(script); 
    }); 
} else { 
    var xhr = io.util.request(); 

    xhr.open('GET', url, true); 
    if (this.isXDomain()) { 
    xhr.withCredentials = true; 
    } 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     xhr.onreadystatechange = empty; 

     if (xhr.status == 200) { 
     complete(xhr.responseText); 
     } else if (xhr.status == 403) { 
     self.onError(xhr.responseText); 
     } else { 
     self.connecting = false;    
     !self.reconnecting && self.onError(xhr.responseText); 
     } 
    } 
    }; 
    xhr.send(null); //This is the line 1659. 
} 
}; 

注意:所有文件都在C:驅動器的文件夾內,而不是在用戶的下面。

問題與安全訪問有關嗎?或者是其他東西?

代碼服務器+客戶端

//Server 
express = require('express'); 
http = require('http'); 
app = express(); 
server = http.createServer(app); 
io = require('socket.io').listen(server); 

app.use(express.static(__dirname + '/public')); 
server.listen(3000); 
app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html'); }); 

//Client 
<script src="/socket.io/socket.io.js"></script> 
<script>var socket = io.connect('http://192.168.1.161:3000');</script> 

路由器配置 http://puu.sh/3ACGz.png

回答

1

確保您的端口(socket.io)是通過路由器轉發。你正在使用公共IP(靜態)。

你應該記住,大多數瀏覽器不允許通過WebSockets連接到頁面中的另一個地址/端口。出於安全原因,您的IP /域和端口應該與您的IP /域和端口服務器的html和js相同。

+0

我需要1個端口的服務器和1個端口的socket.io?現在,我的服務器在端口3000上,我使用var socket = io.connect('http://192.168.1.161:3000'); – PerfectAffix

+0

請分享您在初始化socket.io和http服務器的nod​​e.js中的代碼。 – moka

+0

在問題部分添加。 – PerfectAffix