閱讀目錄1、什么是webSocket?2、webSocket實現(xiàn)原理3、webSocket優(yōu)點4、webSocket和socket的區(qū)別5、webSocket API6、webSocket的使用================================================================ 1、什么是webSocket?webSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動發(fā)送信息給客戶端。默認端口號80和443 2、webSocket實現(xiàn)原理在實現(xiàn)webSocket連線過程中,需要通過瀏覽器發(fā)出webSocket連線請求,然后服務(wù)器發(fā)出回應(yīng),這個過程通常稱為“握手”。在webSocket API,瀏覽器和服務(wù)器只需要做一個握手的動作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以互相傳遞數(shù)據(jù)。
open:值為1,表示連接成功,可以開始通信 closing:值為2,表示連接正在關(guān)閉 closed:值為3,表示連接已經(jīng)關(guān)閉,或者打開連接失敗 (3)webSocket.onopen onopen(): 連接成功后的回調(diào)函數(shù) (7)webSocket.onerror onerror(): 連接發(fā)生錯誤后的回調(diào)函數(shù) (8)webSocket.heartMessage heartMessage: 發(fā)送給后臺的心跳包參數(shù)(必填),給服務(wù)器端的心跳包就是定期給服務(wù)器發(fā)送消息 (9)webSocket.timer timer: 給后臺傳送心跳包的時間間隔,不傳時使用默認值3000毫秒 (10)webSocket.isReconnect isReconnect: 連接斷掉是否重新連接,傳true為重新連接 6、webSocket的應(yīng)用(Github地址:https://github.com/sherry726/webSocket) 1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <meta http-equiv="X-UA-Compatible" content="ie=edge">
7 <title>webSocket封裝</title>
8 </head>
9 <body>
10 <script>
11 /* webSocket封裝
12 * @param url: webSocket接口地址與攜帶參數(shù)(必填)
13 * @param onopen(): 連接成功后的回調(diào)函數(shù)
14 * @param onmessage(): 接收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù)
15 * @param onclose(): 連接關(guān)閉后的回調(diào)函數(shù)
16 * @param onerror(): 連接發(fā)生錯誤后的回調(diào)函數(shù)
17 * @param heartMessage: 發(fā)送給后臺的心跳包參數(shù)(必填),給服務(wù)器端的心跳包就是定期給服務(wù)器發(fā)送消息
18 * @param timer: 給后臺傳送心跳包的時間間隔,不傳時使用默認值3000毫秒
19 * @param isReconnect: 連接斷掉是否重新連接,傳true為重新連接
20 */
21 function useWebSocket(url,onOpenFunc,onMessageFunc,onCloseFunc,onErrorFunc,heartMessage,timer,isReconnect){
22 let isConnected = false; //設(shè)置已連接webSocket標(biāo)識
23 let ws = null; //定義webSocket對象
24 //創(chuàng)建并連接webSocket
25 let connect = function(){
26 if(!isConnected){
27 //若未連接webSocket,則創(chuàng)建一個新的webSocket
28 console.log(url);
29 ws = new WebSocket(url);
30 isConnected = true;
31 }
32 }
33 //向后臺發(fā)送心跳消息
34 let heartCheck = function(){
35 ws.send(JSON.stringify(heartMessage));
36 }
37 //初始化事件回調(diào)函數(shù)
38 let initEventHandle = function(){
39 console.log('已連接');
40 ws.addEventListener('open',function(event){
41 //給后臺發(fā)心跳請求
42 heartCheck();
43 //若傳入函數(shù),執(zhí)行onOpenFunc
44 if(!onOpenFunc){
45 return false;
46 }else{
47 onOpenFunc(event);
48 }
49 })
50 ws.addEventListener('message',function(event){
51 //接收到任何后臺的消息都說明當(dāng)前連接是正常的
52 if(!event){
53 return false;
54 }else{
55 //若獲取到后臺消息,則timer毫秒后再次發(fā)起心跳請求給后臺,檢測是否斷開連接
56 setTimeout(()=>{
57 heartCheck(); //給后臺發(fā)心跳請求
58 },!timer ? 3000 : timer)
59 }
60 //若傳入了函數(shù),執(zhí)行onMessageFunc
61 if(!onMessageFunc){
62 return false;
63 }else{
64 onMessageFunc(event);
65 }
66 })
67 ws.addEventListener('close',function(event){
68 //若傳入函數(shù),執(zhí)行onCloseFunc
69 if(!onCloseFunc){
70 return false;
71 }else{
72 onCloseFunc(event);
73 }
74 if(isReconnect){ //若斷開立即重新連接標(biāo)志為true
75 connect(); //重新連接webSocket
76 }
77 })
78 ws.addEventListener('error',function(event){
79 //若傳入函數(shù),執(zhí)行onErrorFunc
80 if(!onErrorFunc){
81 return false;
82 }else{
83 onErrorFunc(event);
84 }
85 if(isReconnect){ //若斷開立即重新連接標(biāo)志為true
86 connect(); //重新連接webSocket
87 }
88 })
89 }
90 window.onload = function(){
91 //初始化webSocket
92 (function(){
93 //1.創(chuàng)建并連接webSocket
94 connect();
95 //2.初始化事件回調(diào)函數(shù)
96 initEventHandle();
97 //3.返回是否已連接
98 return ws;
99 })()
100 }
101 }
102 useWebSocket("ws://10.170.6.45:8888/websocket/23", //服務(wù)器url
103 null, //onopen的回調(diào)函數(shù)
104 function(event){
105 let res = event.data; //后端返回的數(shù)據(jù),onmessage的回調(diào)函數(shù)
106 console.log(res);
107 },
108 null, //onclose的回調(diào)函數(shù)
109 null, //onerror的回調(diào)函數(shù)
110 { //心跳包消息
111 "action":"66",
112 "eventType":"88",
113 "requestId":"123"
114 },
115 null, //傳送心跳包的間隔時間
116 true //true表示連接斷開立即重新連接
117 )
118 </script>
119 </body>
120 </html>來源:https://www./content-4-592901.html
|
|
|