基于WebSocket的在線文字聊天室

與Ajax不同,WebSocket可以使服務端主動向客戶發送響應,本案例就是基于WebSocket的一個在線聊天室,不過功能比較簡單,只能滿足文字交流。演示如下。

案例學習于b站up主,鏈接?。這位up主講的非常清楚,值得去學習。本文屬于記錄自我學習過程的文章。

項目目錄下app.js

//導入nodejs-websocket包
const { connect } = require('net')
const ws = require('nodejs-websocket')
const PORT = 3000//創建一個server
const server = ws.createServer(connect => {console.log('有用戶連接上來了')
})server.listen(PORT,() => {console.log('websocket服務啟動成功了,監聽了端口'+PORT)
})

項目目錄下打開終端?

npm install nodejs-websocket

?下載成功后。

?項目目錄下index.html

?

去掉css。?

app.js?

//導入nodejs-websocket包
const { connect } = require('net')
const ws = require('nodejs-websocket')
const PORT = 3000//連接的數量
let count = 0
//創建一個server
const server = ws.createServer(connect => {console.log('新的連接')count++connect.userName = `用戶${count}`broadcast(`${connect.userName}進入了聊天室`)//接收connect.on('text',data => {broadcast(data)})//關閉connect.on('close',data => {console.log('關閉連接')count--broadcast(`${connect.userName}離開了聊天室`)})//異常connect.on('error',data => {console.log('發生異常')})
})//廣播
function broadcast(msg) {server.connections.forEach(item => {item.send(msg)})
}server.listen(PORT,() => {console.log('websocket服務啟動成功了,監聽了端口'+PORT)
})

?index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style></style></head><body><div></div><input type="text" placeholder="請輸入你的內容"/><button>發送</button><script>var input = document.querySelector('input')var button = document.querySelector('button')var div = document.querySelector('div')//websocket的服務地址var socket = new WebSocket('ws://localhost:3000')//連接成功時socket.addEventListener('open',function() {div.innerHTML = '連接服務成功了'})//主動向服務器發消息button.addEventListener('click',function() {var value = input.valuesocket.send(value)})//接受數據socket.addEventListener('message',function(e) {console.log(e.data)var dv = document.createElement('div')dv.innerText = e.datadiv.appendChild(dv)})//斷開連接socket.addEventListener('close',function(e) {div.innerHTML = '服務斷開連接'})</script></body>
</html>

瀏覽框1

?

?瀏覽框2

?

稍微美化頁面,增強一下邏輯。在瀏覽器內打開三個窗口,既有3個人參與到聊天室中,現在可以聊天了。

?用戶1

用戶2?

?用戶3

?主要代碼

請先安裝node.js并已下載websocket的環境。

項目目錄:

app.js

//導入nodejs-websocket包
const { connect } = require('net')
const ws = require('nodejs-websocket')
const PORT = 3000
const TYPE_ENTER = 0
const TYPE_LEAVE = 1
const TYPE_MSG = 2//連接的數量
let count = 0
//創建一個server
const server = ws.createServer(connect => {console.log('新的連接')count++connect.userName = `用戶${count}`broadcast({type: TYPE_ENTER,msg: `${connect.userName}進入了聊天室`,time: new Date().toLocaleString('chinese',{hour12:false}).slice(2).replace(/-/g,'/')})//接收connect.on('text',data => {broadcast({type: TYPE_MSG,msg: connect.userName + ':' + data,time: new Date().toLocaleString('chinese',{hour12:false}).slice(2).replace(/-/g,'/')})})//關閉connect.on('close',data => {console.log('關閉連接')count--broadcast({type: TYPE_LEAVE,msg: `${connect.userName}離開了聊天室`,time: new Date().toLocaleString('chinese',{hour12:false}).slice(2).replace(/-/g,'/')})})//異常connect.on('error',data => {console.log('發生異常')})
})//廣播
function broadcast(msg) {server.connections.forEach(item => {item.send(JSON.stringify(msg))})
}server.listen(PORT,() => {console.log('websocket服務啟動成功了,監聽了端口'+PORT)
})

?index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style>* {padding: 0;margin: 0;}body {background: #eff0fe;font-family: '宋體';}#box {padding: 20px;}input {width: 600px;height: 30px;border: none;outline: none;color: gray;}#chat {padding: 10px;background: white;width: 920px;box-sizing: border-box;height: 95vh;}#operation {position: fixed;top: 300px;right: 20px;}#title {font-size: 200px;position: fixed;top: 20px;right: 80px;color: gray;opacity: 0.3;font-family: '黑體';}button {height: 30px;width: 50px;text-align: center;line-height: 30px;border: none;color: gray;}button:hover {cursor: pointer;}.middle {width: 200px;margin: 0 auto;font-size: 3px;color: gray;margin-bottom: 5px;}.msg {width: 900px;word-break: break-all;}</style></head><body><div id="box"><div id="chat"></div><div id="title">聊天室</div><div id="operation"><input type="text" placeholder="請輸入你的內容"/><button>發送</button></div></div><script>const TYPE_ENTER = 0const TYPE_LEAVE = 1const TYPE_MSG = 2var input = document.querySelector('input')var button = document.querySelector('button')var div = document.querySelector('#chat')console.log(input)//websocket的服務地址var socket = new WebSocket('ws://localhost:3000')//連接成功時socket.addEventListener('open',function() {div.innerHTML = '歡迎來到聊天室'})//主動向服務器發消息button.addEventListener('click',function() {var value = input.valuesocket.send(value)input.value = ''})//接受數據socket.addEventListener('message',function(e) {console.log(e.data)var data = JSON.parse(e.data)if(data.type === TYPE_MSG) {var dv = document.createElement('div')var time = document.createElement('div')var msg = document.createElement('div')time.className = 'middle'msg.className = 'msg'time.innerText = data.timemsg.innerText = data.msgdv.appendChild(time)dv.appendChild(msg)} else {var dv = document.createElement('div')var msg = document.createElement('div')var time = document.createElement('div')msg.className = 'middle'time.className = 'middle'msg.innerText = data.msgtime.innerText = data.timedv.appendChild(time)dv.appendChild(msg)}div.appendChild(dv)})//斷開連接socket.addEventListener('close',function(e) {div.innerHTML = '服務斷開連接'})</script></body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

item_get_sales-獲取TB商品銷量詳情

一、接口參數說明&#xff1a; item_get_sales-獲取商品銷量詳情&#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_get_sales 名稱類型必須描述keyString是調用key&#xff08…

Idea 快捷鍵整理

Idea快捷鍵和自動代碼補全匯總 idea快捷鍵匯總 Ctrl 快捷鍵說明Ctrl F在當前文件進行文本查找 &#xff08;必備&#xff09;Ctrl R在當前文件進行文本替換 &#xff08;必備&#xff09;Ctrl Z撤銷 &#xff08;必備&#xff09;Ctrl Y刪除光標所在行 或 刪除選中的行 &am…

設計HTML5圖像和多媒體

在網頁中的文本信息直觀、明了&#xff0c;而多媒體信息更富內涵和視覺沖擊力。恰當使用不同類型的多媒體可以展示個性&#xff0c;突出重點&#xff0c;吸引用戶。在HTML5之前&#xff0c;需要借助插件為網頁添加多媒體&#xff0c;如Adobe Flash Player、蘋果的QuickTime等。…

【C++精華鋪】6.C++類和對象(下)類與對象的知識補充及編譯器優化

目錄 1. 再談構造 1.1 成員變量的初始化&#xff08;初始化列表&#xff09; 1.2 初始化列表的行為 1.3 explicit關鍵字 2. 類中的static成員 2.1 靜態成員變量 2.2 靜態成員函數 3. 友元 3.1 友元函數 3.1 友元類 4. 內部類 5. 匿名對象 6. 對象拷貝時候的編譯器優化…

GitHub 打不開解決方案

GitHub 這幾年國內普通用戶越來越難以訪問&#xff0c;github 作為全球最大的開源平臺&#xff0c;里面有用的內容很多&#xff0c;不管是對專業用戶還是普通用戶&#xff0c;無法訪問都是很嚴重的問題。 1.GitHub 加速鏡像 kgithub 是一個公益加速項目&#xff0c;僅需在 gi…

【LeetCode每日一題】——41.缺失的第一個正數

文章目錄 一【題目類別】二【題目難度】三【題目編號】四【題目描述】五【題目示例】六【題目提示】七【解題思路】八【時間頻度】九【代碼實現】十【提交結果】 一【題目類別】 哈希表 二【題目難度】 困難 三【題目編號】 41.缺失的第一個正數 四【題目描述】 給你一個…

Compute shader SV 理解圖

本圖轉子&#xff1a;【Computeshader】個人總結_蔣偉博的博客-CSDN博客

【Rust】Rust學習 第十二章一個 I/O 項目:構建一個命令行程序

本章既是一個目前所學的很多技能的概括&#xff0c;也是一個更多標準庫功能的探索。我們將構建一個與文件和命令行輸入/輸出交互的命令行工具來練習現在一些你已經掌握的 Rust 技能。 Rust 的運行速度、安全性、單二進制文件輸出和跨平臺支持使其成為創建命令行程序的絕佳選擇…

談一談在兩個商業項目中使用MVI架構后的感悟

作者&#xff1a;leobertlan 前言 當時項目采用MVP分層設計&#xff0c;組員的代碼風格差異也較大&#xff0c;代碼中類職責賦予與封裝風格各成一套&#xff0c;隨著業務急速膨脹&#xff0c;代碼越發混亂。試圖用 MVI架構 單向流 形成 掣肘 帶來一致風格。 但這種做法不夠以…

linux系列基本介紹

雖然我們常說Linux操作系統&#xff0c;這種叫法是不正確的&#xff0c;嚴格意義上講&#xff0c;Linux并不是操作系統&#xff0c;而是屬于操作系統的一個內核&#xff0c;inux內核提供了操作系統的核心功能&#xff0c;如進程管理、內存管理、文件系統等。 Linux有很多不同的…

LeetCode 熱題 100 JavaScript--33. 搜索旋轉排序數組

整數數組 nums 按升序排列&#xff0c;數組中的值 互不相同 。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了 旋轉&#xff0c;使數組變為 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …,…

yolov5 轉換為rknn模型在3588上運行

為了把yolov5在rk3588上跑起來&#xff0c;在網上搜羅了一圈,踩了一些坑。由于瑞芯微的文檔有升級&#xff0c;導致和網絡的文章有出入&#xff0c;所以做個記錄。 rknn-toolkit 轉換文檔&#xff1a; 瑞芯微的轉換文檔在 rknn-toolkit/example/pytorch/yolov5/REAME.md 里 …

LangChain入門:構建LLM驅動的應用程序的初學者指南

LangChain & DemoGPT 一、介紹 你有沒有想過如何使用大型語言模型&#xff08;LLM&#xff09;構建強大的應用程序&#xff1f;或者&#xff0c;也許您正在尋找一種簡化的方式來開發這些應用程序&#xff1f;那么你來對地方了&#xff01;本指南將向您介紹LangChain&#x…

【Sklearn】基于邏輯回歸算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于邏輯回歸算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 邏輯回歸是一種用于二分類問題的統計學習方法,盡管名字中含有“回歸”,但實際上是一種分類算法。它的基本原理是通…

網絡基礎--ARP協議介紹

1、ARP作用 ARP&#xff08; Address Resolution Protocol&#xff0c;地址解析協議&#xff09;是將 IP 地址解析為以太網 MAC 地址&#xff08;或稱物理地址&#xff09;的協議。在局域網中&#xff0c;當主機或其它網絡設備有數據要發送給另一個主機或設備時&#xff0c;它必…

Java鷹眼軌跡服務 輕騎小程序 運動健康與社交案例

Java地圖專題課 基本API BMapGLLib 地圖找房案例 MongoDB 百度地圖鷹眼軌跡服務 鷹眼軌跡服務概述 鷹眼是一套軌跡管理服務&#xff0c;提供各端SDK和API供開發者便捷接入&#xff0c;追蹤所管理的車輛/人員等運動物體。 基于鷹眼提供的接口和云端服務&#xff0c;開發者可以迅…

前后端分離------后端創建筆記(05)用戶列表查詢接口(下)

本文章轉載于【SpringBootVue】全網最簡單但實用的前后端分離項目實戰筆記 - 前端_大菜007的博客-CSDN博客 僅用于學習和討論&#xff0c;如有侵權請聯系 源碼&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Java通過文件流和文件地址下載文件

通過文件流下載文件 如何使用 MultipartFile 進行文件上傳、下載到本地&#xff0c;并返回保存路徑呢&#xff1a; import org.springframework.web.multipart.MultipartFile;import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOExcep…

Redis_緩存2_緩存刪除和淘汰策略

14.5 緩存數據的刪除和替換 14.5.1 過期數據 可以使用ttl查看key的狀態。已過期的數據&#xff0c;redis并未馬上刪除。優先去執行讀寫數據操作&#xff0c;刪除操作延后執行。 14.5.2 刪除策略 redis中每一個value對應一個內存地址&#xff0c;在expires&#xff0c;一個內…

BC117 小樂樂走臺階(附完整代碼)

描述 小樂樂上課需要走n階臺階&#xff0c;因為他腿比較長&#xff0c;所以每次可以選擇走一階或者走兩階&#xff0c;那么他一共有多少種走法&#xff1f; 輸入描述 輸入包含一個整數n (1 ≤ n ≤ 30) 輸出描述 輸出一個整數&#xff0c;即小樂樂可以走的方法數。 思路&a…