成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對 Websocket 完全不懂,但又想搞個聊天室,行嗎?

開發 前端
Websocket 的客戶端并沒有什么技術難點,就是瀏覽器 API 調用。只要你把通信機制夠清楚,這玩意就沒有不會,因為非常簡單,我們直接選擇純手寫就可以了,如果你想使用 Websocket-Node 客戶端,確實還會更簡單。

本文轉載自微信公眾號「勾勾的前端世界」,作者xilingls。轉載本文請聯系勾勾的前端世界公眾號。

回憶以下上一篇內容:《有了 HTTP 協議,為什么還需要 Websocket?》,了解一下 Websocket 的特點和通信原理,我們接著來看 Websocket 服務端與客戶端實現。

Websocket 服務端與客戶端實現

經過前面對通信過程的梳理,我們將 WebSocket 通信的基本機制已經說的差不多了,為了方便你快速進入實戰階段,我們暫時放棄純手寫實現,直接選擇使用老牌的 WebSocket 庫: WebSocket-Nodehttps://github.com/theturtle32/WebSocket-Node

簡單介紹一下 WebSocket-Node,它有多老牌呢?

NPM 的包名字就是直接使用的 “WebSocket”。曾經,我們西嶺老濕看到之后就給出了兩個字的評價:“猖狂”。

這個庫完全使用 JavaScript 實現,包含了客戶端及服務端的實例。其中,客戶端包含了 Node 和 瀏覽器 兩個運行環境的代碼,除了支持我們前面提到的 Websocket 協議的 13 版本,它同時還支持 Websocket 協議 8 這個老版本,實屬優秀。

接下來,我們就來看看,如何借助 Websocket-Node 實現一個 Websocket 服務。

服務端

安裝 npm install websocket 后,創建服務器運行文件 ws-server.js ,代碼如下,請認真閱讀代碼及注釋:

  1. // === 作為帥哥,一定要加注釋 === 
  2. var Websocket = require('websocket').server 
  3. var http = require('http'
  4.  
  5. // 創建 HTTP 服務,作為第一次握手鏈接使用 
  6. var httpServer = http.createServer().listen(8080,function(){ 
  7.   console.log('http://127.0.0.1:8080'
  8. }) 
  9.  
  10. // 創建 websocket 服務實力 
  11. var wsServer = new Websocket({ 
  12.   // 配置依賴的握手 http 服務器 
  13.   httpServer:httpServer, 
  14.  
  15.   autoAcceptConnections:false 
  16. }) 
  17.  
  18. // 保存鏈接池 
  19. var conArr = [] 
  20.  
  21. // 監聽 ws 請求事件 
  22. wsServer.on('request',function(request){ 
  23.   // 獲取鏈接示例 
  24.   var connection = request.accept() 
  25.   // 保存連接池 
  26.   conArr.push(connection
  27.   // 監聽消息事件 
  28.   connection.on('message',function(msg){ 
  29.     console.log(msg) 
  30.     // 循環連接池,推送廣播消息至客戶端 
  31.     for(let i = 0;i<conArr.length;i++){ 
  32.       conArr[i].send(msg.utf8Data) 
  33.     } 
  34.   }) 
  35. }) 
  36.  
  37. // 據說,長得好看的都會看注釋 

過多的描述,就不寫了,據說,長得好看的都會看代碼注釋(●'?'●)

運行代碼文件后,不出意外的情況下,命令行進程會被占用,監聽端口也會被占用,證明服務端運行成功。如果兩個都沒被占用,想啥呢?失敗了呀寶子……

如果服務器啟動成功,我怎么用客戶端建立鏈接查看呢?有一款 Websocket 客戶端工具叫 WebsocketMan,如果感興趣,你可以下載來試試。

但是像我這樣的帥哥,一般都是自己寫客戶端:)

客戶端

Websocket 的客戶端并沒有什么技術難點,就是瀏覽器 API 調用。只要你把通信機制夠清楚,這玩意就沒有不會,因為非常簡單,我們直接選擇純手寫就可以了,如果你想使用 Websocket-Node 客戶端,確實還會更簡單。

當然,在寫之前,還是要去看看手冊的,要不然你怎么知道有哪些 API 呢?

來,手冊地址給你:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

你先看著,我就不客氣,直接開干……

  1. <body> 
  2.   <div id="msg"></div> 
  3.   <input type="text" id="text"
  4.   <input type="button" value="發送" onclick="send()"
  5.  
  6.   <script> 
  7.     //調用websocket對象建立連接: 
  8.     //參數:ws/wss(加密)://ip:port (字符串) 
  9.     var websocket = new WebSocket('ws://127.0.0.1:8080'
  10.     // console.log(websocket.readyState) // 0  
  11.     // readyState  
  12.     // 0 鏈接還沒有建立(正在建立鏈接) 
  13.     // 1 鏈接建立成 
  14.     // 2 鏈接正在關閉 
  15.     // 3 鏈接已經關閉 
  16.  
  17.     // 監聽鏈接開啟事件 
  18.     websocket.onopen = function () { 
  19.       console.log(websocket.readyState) 
  20.     } 
  21.  
  22.     // 綁定按鈕點擊事件 
  23.     function send() { 
  24.       var text = document.getElementById('text').value 
  25.       // ws 消息發送 
  26.       websocket.send(text) 
  27.     } 
  28.  
  29.     // 監聽服務端消息推送事件 
  30.     websocket.onmessage = function (back) { 
  31.       console.log(back.data) 
  32.     } 
  33.  
  34.     // 監聽連接錯誤信息 
  35.     // websocket.onerror = function (evt, e) { 
  36.     //   console.log('Error occured: ' + evt.data); 
  37.     // }; 
  38.  
  39.     //監聽連接關閉 
  40.     // websocket.onclose = function (evt) { 
  41.     //   console.log("Disconnected"); 
  42.     // }; 
  43. </script> 
  44.  
  45. </body> 

過多的描述,就不寫了,據說,長得好看的都會看代碼注釋(●'?'●)

至此,一個完整的 websocket 通信已經建立完成并能夠進行雙向通信了。

Websocket-Node 確實很好用,但是功能也確實比較單一了,需要你對 WebSocket 機制有一定的理解之后,才能實現相應的能力。如果,我對 websocket 完全不懂,但又想搞個聊天室,能不能行?

指!定!能!行!

Socket.IO

一個目前最為強大且好用的,基本屏蔽了 websocket 概念的 websocket 庫。你幾乎不用掌握 websocket 相關的知識,只需要按照 Socket.IO 中提供的 API 就能夠很好的實現一個 websocket 通信。

注意:程序員要“除機心”。

  • 在不了解 Websocket 時,學習 Websocket 中,強烈不建議使用。
  • 在生產環境下,強烈建議使用。

服務端

  1. const { createServer } = require("http"); 
  2. const { Server } = require("socket.io"); 
  3.  
  4. const httpServer = createServer(); 
  5. const io = new Server(httpServer, { 
  6.   cors: { 
  7.     origin: "*"
  8.     methods: ["GET""POST"
  9.   } 
  10. }); 
  11.  
  12. io.on("connection", (socket) => { 
  13.   socket.on('sendMsg',(data)=>{ 
  14.     io.emit('pushMsg',data) 
  15.   }) 
  16. }); 
  17.  
  18. httpServer.listen(3000, function () { 
  19.   console.log('http://127.0.0.1:3000'
  20. }); 

客戶端

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.  
  4. <head> 
  5.   <meta charset="UTF-8"
  6.   <meta http-equiv="X-UA-Compatible" content="IE=edge"
  7.   <meta name="viewport" content="width=device-width, initial-scale=1.0"
  8.   <title>Document</title> 
  9.   <script src="https://cdn.socket.io/4.2.0/socket.io.min.js" 
  10.     integrity="sha384-PiBR5S00EtOj2Lto9Uu81cmoyZqR57XcOna1oAuVuIEjzj0wpqDVfD0JA9eXlRsj" 
  11.     crossorigin="anonymous"></script> 
  12. </head> 
  13.  
  14. <body> 
  15.   <input type="text" id="text"
  16.   <input type="button" value="發送" onclick="send()"
  17.  
  18.   <script> 
  19.     var socket = io.connect('http://127.0.0.1:3000'
  20.     function send() { 
  21.       var text = document.getElementById('text').value 
  22.       socket.emit('sendMsg', text) 
  23.     } 
  24.  
  25.     socket.on('pushMsg', (data) => { 
  26.       console.log(data) 
  27.     }) 
  28. </script> 
  29.  
  30. </body> 
  31.  
  32. </html> 

沒什么可解釋的,就直接按照 Socket.IO 的 API 寫就完事了。

吾聞之吾師,有機械者必有機事,有機事者必有機心。機心存於胸中,則純白不備。

-- 《莊子·天地》

參考資料:

  • 《HTML5 WebSocket權威指南》 機械工業出版社 2014 年 3 月第 1 版
  • http://www.ruanyifeng.com/blog/2017/05/websocket.html
  • https://www.cnblogs.com/hustskyking/p/websocket-with-node.html
  • https://www.cnblogs.com/jingmoxukong/p/7755643.html
  • https://zhuanlan.zhihu.com/p/23467317
  • https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

庫: 

  • https://socket.io/docs/
  • https://github.com/theturtle32/WebSocket-Node
責任編輯:武曉燕 來源: 勾勾的前端世界
相關推薦

2023-02-10 08:16:48

WebSocket簡易聊天室

2022-07-26 14:53:10

WebSocket網絡通信協議

2025-05-09 08:35:00

聊天室FastAPIWebSocket

2023-01-05 09:17:58

2023-01-13 00:02:41

2011-12-15 11:11:51

JavaNIO

2022-11-14 08:01:48

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2015-07-06 10:42:18

PHP聊天室應用

2024-01-18 11:15:46

Pythonsocket聊天室

2021-02-06 23:26:25

聊天室開發WebSocket

2011-06-09 15:44:29

Spring

2022-12-01 08:25:23

eTsTCP聊天室

2015-08-06 17:17:33

swoole聊天室

2022-04-18 10:36:48

社交軟件聊天平臺rocket.cha

2021-12-09 16:48:25

鴻蒙HarmonyOS應用

2022-04-02 11:28:37

元宇宙遠程辦公

2025-06-09 02:00:00

項目技術棧Spring

2013-11-27 10:46:31

JavaEEWebsockets
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看国产a | 成人久久久 | 日韩影音 | 久久精品国产免费一区二区三区 | 亚洲一页 | 一本色道精品久久一区二区三区 | 午夜精品网站 | 中文字幕在线人 | 久久激情网 | 日本不卡一区 | 亚洲成人精品 | 精品视频99 | 国产精品高潮呻吟久久久久 | 亚洲精品欧美一区二区三区 | 精品久久香蕉国产线看观看亚洲 | 99爱免费 | 欧美日韩亚洲一区 | 99爱视频| 国产区视频在线观看 | 99久久婷婷国产综合精品电影 | www.黄色在线观看 | 欧美一区二区三区在线观看 | 国产成人影院 | 久久精品免费观看 | 精品一区在线 | 亚洲精品91| www.久| 98久久| 7777精品伊人久久精品影视 | 韩日在线 | 麻豆av免费观看 | 中文在线一区二区 | 久草免费在线视频 | 国产96在线 | 国产精品一区二区三区久久久 | 国产免费一级一级 | av在线电影网站 | 老外几下就让我高潮了 | 日韩 欧美 二区 | 手机av免费在线 | 欧美日韩福利视频 |