2017-02-09 254 views
0

因此,我試圖連接到我使用Node.js,Socket.io和Express從外部Internet創建的服務器,不在我的本地網絡上。 這裏是我的代碼:無法連接到外部的Node.js/Socket.io/Express服務器

服務器:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket){ 
    socket.on('chat message', function(msg){ 
    io.emit('chat message', msg); 
    }); 
}); 

http.listen(3000,function(){ 
    console.log('listening on *:3000'); 
}); 

客戶:

<!doctype html> 
<html> 
    <head> 
    <title>Socket.IO chat</title> 
    <style> 
     * { margin: 0; padding: 0; box-sizing: border-box; } 
     body { font: 13px Helvetica, Arial; } 
     form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; } 
     form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; } 
     form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; } 
     #messages { list-style-type: none; margin: 0; padding: 0; } 
     #messages li { padding: 5px 10px; } 
     #messages li:nth-child(odd) { background: #eee; } 
    </style> 
    </head> 
    <body> 
    <ul id="messages"></ul> 
    <form action=""> 
     <input id="m" autocomplete="off" /><button>Send</button> 
    </form> 
    <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
    <script> 
     var socket = io(); 
     $('form').submit(function(){ 
     socket.emit('chat message', $('#m').val()); 
     $('#m').val(''); 
     return false; 
     }); 
     socket.on('chat message', function(msg){ 
     $('#messages').append($('<li>').text(msg)); 
     }); 
    </script> 
    </body> 

我已經端口轉發端口3000 http://localhost:3000/作品,所以沒有連接上的其他計算機同一網絡,但我得到了我的外部IP:12.888.999.12(隨機IP)。我也有我的端口3000.當我在谷歌瀏覽器連接http://12.888.999.12:3000不起作用。

+0

你是從自己的網絡嘗試,還是嘗試不同的地方?如果很多路由器沒有爲來自內部的流量進行端口轉發,並且應該返回到內部,我不會感到驚訝。 – jcaron

+0

您正在本地主機上偵聽。嘗試'http.listen(3000,'0.0.0.0')'並確保你在TCP上完成端口轉發3000 –

回答

1

當你說外部IP這是否意味着你已經購買了某個地方的雲服務器或者它在Intranet上..你使用哪個操作系統?服務器機器上的端口3000是否打開?

例如。如果在Windows機器,你需要去的Windows高級安全防火牆,並打開TCP訪問

入站口如果你已經這樣做了,然後試試這個::

http.listen(3000, '0.0.0.0', function() { 
    console.log('Listening to port: ' + 3000); 
}); 

,然後嘗試訪問http://12.888.999.12:3000

+0

因此,我使用的是Windows 10.當我說外部IP時,我的意思是我去了谷歌並擡頭看看我的IP與「我的IP是什麼」。我在防火牆上打開了端口3000。 – SomeGuy1337

+0

已編輯我的答案..如果有幫助:) – Aniket

0

這個問題很可能是您的routeur處理查詢(因爲它知道ip屬於他)而不是將它返回到您的服務器(即使端口正確地完成)。

附註:我過去曾經處理任何類型的流量(來自任何端口)並始終返回500個HTTP錯誤。

所以我建議你使用randomwebsite來測試你的端口是否可以從互聯網上訪問,然後繼續使用本地主機從你自己的計算機上測試你的服務器。

如果沒有,那麼它可能是兩件事情:從你的路由器

  1. 你的端口映射錯

必須在路由器配置中使用您的局域網IP。

源端口(如果你能提供一個)應該是你想從互聯網上使用的端口,目的端口應該是從你的服務器(此處3000)的端口,你用電腦做

測試在您的局域網只確認您的服務器計算機的防火牆是正確配置的,它沒有在路由器端測試任何東西。

  • ISP可能阻止傳入流量(它是不太可能你的情況,因爲如果這樣做,將關於標準端口,例如80,21,8080,443)