2013-04-12 89 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