關於websocket和ajax無刷新


HTTP無狀態: 

 

Ajax只能實現用戶和服務器單方面響應(單工機制). 

如果設置為長輪詢(ajax設置多少秒進行一次請求,時間間隙可能會有延遲,且浪費資源 

如果設置為長連接客戶端請求一次,服務器保持持續鏈接一旦有了新數據,就全部發送客戶端 

 

webScoket: 

webSocket是響應客戶端和服務器端雙響應(全雙工機制). 

 

支持的瀏覽器有:Chrome4+、Firefox4+、IE10+(“+”包含本身) 

支持的服務器有:Node0、Apache7.0.2、Nginx1.3 

 

1. 采用webscoket - 節省資源

 1  var websocket = null;  2         //判斷當前瀏覽器是否支持WebSocket
 3         if ('WebSocket' in window || window in WebSocket) {  4             //建立連接,這里的/websocket ,是ManagerServlet中開頭注解中的那個值
 5             websocket = new WebSocket("ws://localhost:8080");  6  }  7         else {  8             alert('當前瀏覽器 Not support websocket')  9  } 10         //連接發生錯誤的回調方法
11         websocket.onerror = function () { 12             setMessageInnerHTML("WebSocket連接發生錯誤"); 13  }; 14         //連接成功建立的回調方法
15         websocket.onopen = function () { 16             setMessageInnerHTML("WebSocket連接成功"); 17  } 18         //接收到消息的回調方法
19         websocket.onmessage = function (event) { 20             setMessageInnerHTML(event.data); 21             if (event.data == "1") { 22  location.reload(); 23  } 24  } 25         //連接關閉的回調方法
26         websocket.onclose = function () { 27             setMessageInnerHTML("WebSocket連接關閉"); 28  } 29         //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。
30         window.onbeforeunload = function () { 31  closeWebSocket(); 32  } 33         //將消息顯示在網頁上
34  function setMessageInnerHTML(innerHTML) { 35             document.getElementById('message').innerHTML += innerHTML + '<br/>'; 36  } 37         //關閉WebSocket連接
38  function closeWebSocket() { 39  websocket.close(); 40         }

 

2.ajax(長輪詢) - 浪費服務器和客戶端資源

 

 1 <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
 2 <script>
 3     //每500ms使用ajax取一次數據
 4     setTimeout(function () {  5         var fun = arguments.callee;  6         // 重復調用 - 500ms.
 7         setTimeout(fun, 500);  8 
 9         // 這里寫ajax代碼.
10         console.log(fun, 'ajax執行了!'); 11 
12     }, 500); 13 </script>

 

 

 

 

 

 

3.服務器長連接(具體由后台操作服務器執行.)

 

 

采用nodejs做的一個示例

怎么使用(同一項目文件目錄下):

 

npm i socket.io

 

index.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8     <title>Document</title>
 9 </head>
10 
11 <body>
12     <input type="text" id="text" width="500">
13     <input type="button" value="發送消息" id="btn">
14 
15     <script type="text/javascript" src="/socket.io/socket.io.js"></script>
16     <script type="text/javascript">
17         var socket = io(); 18  document.getElementById('btn').onclick = function () { 19  socket.emit('program', document.getElementById('text').value); 20  } 21  socket.on('reply', function (msg) { 22  console.log(msg); 23  }); 24     </script>
25 </body>
26 
27 </html>

 

 

node-server.js

 1 const http = require('http');  2 const fs = require('fs');  3 
 4 const server = http.createServer(function (req, res) {  5     if (req.url == '/') {  6         fs.readFile('./index.html', function (err, data) {  7  res.end(data);  8  });  9  } 10 }); 11 
12 const io = require('socket.io')(server); 13 let number = 1; 14 io.on('connection', function (socket) { 15     console.log(number++ + '個客戶已連接...'); 16     socket.on('program', function (msg) { 17         console.log('接收的信息:' + msg); 18         socket.emit('reply', msg); 19  }) 20 }) 21 
22 server.listen(8080, '127.0.0.1');

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM