2013-04-12 126 views
2

全部:http連接請求和socket.io連接之間的區別

我是新來的node.js和socket.io,並且不知道協議是如何工作的。但我正在學習。

我得到socket.io初學者問題,如果我從喜歡一些教程拿到代碼:

var http = require('http'); 
var fs = require('fs'); 

var app = http.createServer(
     function(request, response){ 
      console.log("New Connection!"); 
      fs.readFile(
       "client.html","utf-8", 
       function(err, data){ 
        response.writeHead(200, {'Content-Type':'text/html'}); 
        response.write(data); 
        response.end(); 
       } 
      ); 
     } 
).listen(1337); 



var io = require('socket.io').listen(app); 

io.sockets.on(
      'connection', 
      function(socket){ 
       socket.on(
         'message_to_server', 
         function(data){ 
         io.sockets.emit('message_to_client',{message: data['message']}); 
         } 
       ); 
      } 
); 

我的問題是能有人告訴我這個代碼是如何工作的?我感到困惑的是:

它看起來像socket.io只是包裝應用程序,發送和接收事件消息和做回調。但我想知道爲什麼這些行動不會觸發應用程序的請求事件,我把console.log(「新連接!」);在回調中,它只會在我輸入服務器地址並在瀏覽器中按回車時顯示,但是當我按下發送按鈕時,它不會顯示任何內容?

這裏是我的客戶端代碼:

<!DOCTYPE html> 

<html> 
    <head> 
     <script src="/socket.io/socket.io.js"></script> 
     <script type="text/javascript"> 
      // Out client code here. 
      var socketio = io.connect("192.168.1.150:1337"); 
      socketio.on(
        'message_to_client', 
        function(data){ 
         document.getElementById("chatlog") 
         .innerHTML= 
         ("<hr/>"+data['message']+document.getElementById("chatlog").innerHTML); 
        } 
      ); 

      function sendMessage(){ 
       var msg = document.getElementById("message_input").value; 
       if(msg!=""){ 
        socketio.emit("message_to_server", {message:msg}); 
       } 
      } 
     </script> 
    </head> 
    <body> 
     <input type="text" id="message_input" /> 
     <button onclick="sendMessage()">SEND</button> 
     <div id="chatlog"></div> 
    </body> 
</html> 

回答

4

在你的代碼app是一個HTTP服務器,io是WebSocket的服務器。正如你知道http服務器提供http請求,而websocket服務器使用websocket協議。檢查wiki

  • 的http://是http協議和https://是HTTP安全協議
  • WS://是web套接字協議和WSS://是網絡插座安全協議

什麼這確實是

var app = http.createServer(
    function(request, response){ 
     console.log("New Connection!"); 

它啓動一個http服務器並對每個http請求執行給定的函數。爲你,它打印New Connection併發送client.html。

這樣做有什麼

var io = require('socket.io').listen(app); 

它告訴套接字服務器掛鉤到HTTP服務器。它偵聽與用於websocket連接的http/https服務器相同的地址和端口。

這樣做有什麼

var socketio = io.connect("192.168.1.150:1337"); 

Conencts在192.168.1.150:1337到的WebSocket服務器和用於通信的插座。你說當你點擊發送時什麼都沒有顯示,你使用的地址是否正確?試試這個,它自動獲取地址(使用中):

var socketio = io.connect(""); 
+0

Thanks user568109! – Kuan

+0

我試過io.connect(「」)。當我在該文本輸入框中輸入一些字符串並按發送時,服務器端僅打印信息信息,但它不打印出新的連接!只有當我刷新頁面或按下地址欄中的輸入時,服務器纔可以打印新建連接?我想知道:是否因爲websocket請求無法觸發應用httpserver的請求功能? – Kuan

+0

看來客戶端無法連接打開websocket連接。我可以在本地機器上運行你的代碼。你在哪裏部署你的服務器? – user568109