nodejs使用WebSocket實現聊天效果

在nodejs中使用WebSocket實現聊天效果(簡易實現)

安裝

npm i ws

實現

創建 server.js

/*** 創建一個 WebSocket 服務器,監聽指定端口,并處理客戶端連接和消息。** @param {Object} WebSocket - 引入的 WebSocket 模塊,用于創建 WebSocket 服務器。** 功能步驟:* 1. 創建一個 WebSocket 服務器,監聽端口 1024。* 2. 維護一個消息列表 `list`,用于存儲客戶端發送的消息。* 3. 當客戶端發送消息時,解析消息內容并將其添加到消息列表中。* 4. 將更新后的消息列表發送回客戶端。*/const WebSocket = require('ws')// 消息列表,用于存儲所有客戶端發送的消息
let list = []// 創建 WebSocket 服務器,監聽端口 1024
const wss = new WebSocket.Server({port: 1024},() => {console.log('Server is listening on port 1024')}
)// 監聽客戶端連接事件
wss.on('connection', function (ws) {// 監聽客戶端發送的消息事件ws.on('message', function (msg) {// console.log('收到客戶端消息', JSON.parse(msg))try {// 解析客戶端發送的消息if (msg) {// 如果消息沒有錯誤,將消息內容添加到消息列表中list.push(JSON.parse(msg).netName + ' 說: ' + JSON.parse(msg).msg)}} catch (error) {}// 將更新后的消息列表發送回客戶端ws.send(JSON.stringify(list))})
})

創建 client.js 測試

/*** 創建一個WebSocket客戶端,用于連接指定的WebSocket服務器。** 參數:* - 'ws://192.168.8.183:1024': WebSocket服務器的URL地址。*/
const WebSocket = require('ws')const ws = new WebSocket('ws://192.168.8.183:1024')// 當WebSocket連接成功打開時觸發
ws.on('open', function () {console.log('Client is listening on port 1024') // 打印日志,表示客戶端已成功連接到服務器ws.send(JSON.stringify('Hello World')) // 向服務器發送消息
})// 當接收到服務器發送的消息時觸發
ws.on('message', function (msg) {console.log('收到服務器消息', JSON.parse(msg))// ws.send(msg) // 將接收到的消息原樣返回給服務器
})// 當WebSocket連接關閉時觸發
ws.on('close', function () {console.log('Client close') // 打印日志,表示客戶端連接已關閉
})

?分別運行以上兩個文件,如果互相能收到消息表示服務運行正常

?創建 index.html 文件

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>WebSocket 消息發送</title><style>/* 消息輸入框樣式 */#text {width: 350px;height: 30px;}/* 用戶名輸入框樣式 */#netName {width: 150px;height: 30px;}</style></head><body><!-- 消息顯示區域 --><textarea id="msg" cols="80" rows="30" readonly></textarea><br /><!-- 用戶名輸入框 --><input id="netName" type="text" placeholder="名稱" /><!-- 消息輸入框 --><input id="text" type="text" placeholder="消息" /><!-- 發送按鈕 --><button id="sendButton">發送</button><script>let ws = null // WebSocket 連接對象/*** 初始化 WebSocket 連接*/function initWebSocket() {if (ws) return // 避免重復連接ws = new WebSocket('ws://192.168.8.183:1024')ws.onopen = () => {console.log('WebSocket 連接已建立')}ws.onmessage = (evt) => {try {const receivedData = JSON.parse(evt.data)msg.value = Array.isArray(receivedData) ? receivedData.join('\n') : JSON.stringify(receivedData, null, 2)} catch (error) {console.error('解析接收到的數據失敗:', error)}}ws.onerror = (error) => {console.error('WebSocket 錯誤:', error)}ws.onclose = () => {console.log('WebSocket 連接已關閉,嘗試重新連接...')ws = nullsetTimeout(initWebSocket, 5000) // 5 秒后重連}setInterval(() => {ws.send('')}, 1000)}/*** 發送消息到 WebSocket 服務器* @param {Object} data - 要發送的數據對象*/function sendMessage(data) {if (!ws || ws.readyState !== WebSocket.OPEN) {console.warn('WebSocket 未打開,嘗試重新連接...')initWebSocket()return}if (!data) {data = { err: 1 }} else if (typeof data !== 'object' || Array.isArray(data)) {console.error('數據格式無效')return}ws.send(JSON.stringify(data))}/*** 處理發送按鈕點擊或回車鍵事件*/function handleSend() {const netNameValue = netName.value.trim()const textValue = text.value.trim()if (!netNameValue || !textValue) {alert('用戶名和消息不能為空')return}const message = {netName: netNameValue,msg: textValue}sendMessage(message)text.value = '' // 清空消息輸入框}// 初始化 WebSocket 連接initWebSocket()// 綁定發送按鈕點擊事件document.getElementById('sendButton').addEventListener('click', handleSend)// 監聽回車鍵事件document.addEventListener('keyup', (e) => {if (e.key === 'Enter') {handleSend()}})</script></body>
</html>

用兩個瀏覽器打開此文件,就可以互相發送消息

靜態文件服務?

或者創建一個 static.js 靜態服務訪問 index.html

// static.jsconst express = require('express')
const app = express()
const path = require('path')app.use('/main', express.static(path.join(__dirname, 'index.html'))) // 設置靜態文件夾// 端口號不能與socket監聽的端口號一樣
app.listen(2048, () => {console.log('static 2048 Server Start~')
})

啟動服務

node static.js

訪問:?http://127.0.0.1:2048/main

?以上所有文件放在同一目錄

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

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

相關文章

Web網頁制作(靜態網頁):千年之戀

一、是用的PyCharm來寫的代碼 二、代碼中所用到的知識點&#xff08;無 js&#xff09; 這段HTML代碼展示了一個簡單的注冊頁面&#xff0c;包含了多個HTML元素和CSS樣式的應用。 這段HTML代碼展示了一個典型的注冊頁面&#xff0c;包含了常見的HTML元素和表單控件。通過CSS樣…

操作系統知識點23

1.實時操作系統的主要設計目標&#xff1a;在嚴格時間氛圍內對外部請求做出反應。 2.當用戶程序正在處理器上運行時&#xff0c;若此刻取到了一條特權指令&#xff0c;則處理器將停止執行該指令&#xff0c;并產生一個“非法操作”的事件 3.某網絡監控系統中。多個被授權的用…

CSS—網格布局Grid

網格布局grid 提供了帶有行和列的基于網格的布局系統&#xff0c;無需使用浮動和定位。 當 HTML 元素的 display 屬性設置為 grid 或 inline-grid 時&#xff0c;它就會成為網格容器。 更多布局模式可以參考之前的博客&#xff1a; ??????CSS—flex布局、過渡transit…

如何將本地已有的倉庫上傳到gitee (使用UGit)

1、登錄Gitee。 2、點擊個人頭像旁邊的加號&#xff0c;選擇新建倉庫&#xff1a; 3、填寫倉庫相關信息 4、復制Gitee倉庫的地址 5、綁定我們的本地倉庫與遠程倉庫 6、將本地倉庫發布&#xff08;推送&#xff09;到遠程倉庫&#xff1a; 注意到此處報錯&#xff0c;有關于…

【JAVA面試題】Spring、Spring MVC、Spring Boot、Spring Cloud的區別與聯系

在Java生態中&#xff0c;Spring框架及其衍生技術&#xff08;如Spring MVC、Spring Boot、Spring Cloud&#xff09;是開發企業級應用的核心工具。它們在功能、定位和使用場景上各有側重&#xff0c;但又緊密聯系。本文將詳細解析它們的區別與聯系&#xff0c;幫助你在面試中更…

【Linux系統編程】初識系統編程

目錄 一、什么是系統編程1. 系統編程的定義2. 系統編程的特點3. 系統編程的應用領域4. 系統編程的核心概念5. 系統編程的工具和技術 二、操作系統四大基本功能1. 進程管理&#xff08;Process Management&#xff09;2. 內存管理&#xff08;Memory Management&#xff09;3. 文…

Web基礎:HTML快速入門

HTML基礎語法 HTML&#xff08;超文本標記語言&#xff09; 是用于創建網頁內容的 標記語言&#xff0c;通過定義頁面的 結構和內容 來告訴瀏覽器如何呈現網頁。 超文本&#xff08;Hypertext&#xff09; 是一種通過 鏈接&#xff08;Hyperlinks&#xff09; 將不同文本、圖像…

Linux基本操作指令3

1、wget: 這是一個用于從網絡上下載文件的命令行工具。它支持 HTTP、HTTPS 和 FTP 協議。 wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 2、下載完成后&#xff0c;你可以通過以下命令使文件可執行并運行安裝程序&#xff1a; ch…

Deeplabv3+改進3:在主干網絡中添加NAMAttention|助力漲點!

??【DeepLabv3+改進專欄!探索語義分割新高度】 ?? 你是否在為圖像分割的精度與效率發愁? ?? 本專欄重磅推出: ? 獨家改進策略:融合注意力機制、輕量化設計與多尺度優化 ? 即插即用模塊:ASPP+升級、解碼器 PS:訂閱專欄提供完整代碼 目錄 論文簡介 步驟一 步驟二…

二分查找(遞歸和迭代)– Python

1. 使用遞歸進行二分查找的 Python 程序 創建一個遞歸函數&#xff0c;并將搜索空間的 mid 與 key 進行比較。根據結果&#xff0c;要么返回找到鍵的索引&#xff0c;要么調用下一個搜索空間的遞歸函數。 # 用于遞歸二進制搜索的 Python 3 程序。 # 在注釋中可以找到對舊版 Pyt…

電力場景絕緣子缺陷分割數據集labelme格式1585張4類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件) 圖片數量(jpg文件個數)&#xff1a;1585 標注數量(json文件個數)&#xff1a;1585 標注類別數&#xff1a;4 標注類別名稱:["broken part","broken insulat…

部署說明書

一、打開IIS功能 1、 雙擊“此電腦” 2、 在空白地方右鍵后&#xff0c;點擊屬性 3、 點擊控制面板主頁 4、 查看方式選擇小圖標&#xff0c;然后點擊”程序和功能” 5、點擊”啟用或關閉Windows功能” 6、 勾選”Internet Information Services”勾選“IIS管理服務…

在vue2項目中el-table表格的表頭和內容錯位問題

一、問題描述以及產生原因 問題描述&#xff1a;當el-table表格有橫向滾動條和縱向滾動條&#xff0c;把橫向滾動條拉到最右邊&#xff0c;表格的表頭會和內容錯位&#xff08;表頭和內容列不對齊&#xff09;問題產生原因&#xff1a;在el-table有縱向滾動條時&#xff0c;el…

《基于深度學習的圖像修復技術研究與應用-圖像修復》—3000字論文模板

摘要(500字) (擴展方向:補充具體技術指標與創新點量化描述) 本文針對圖像修復技術展開研究,重點探討了基于深度學習的方法在圖像修復領域的應用。研究首先回顧了傳統圖像修復技術,隨后深入分析了深度學習在圖像修復中的優勢。本文提出了一種改進的深度學習圖像修復模型…

基于Python+Vue的智能服裝商城管理系統的設計與實現

&#x1f457; 基于PythonVue的智能服裝商城管理系統的設計與實現 電商級解決方案&#xff1a;全棧技術融合 智能推薦系統 多維度數據分析 項目亮點&#xff1a;課程設計優選 | 企業級架構規范 | 完整電商功能閉環 | 畢業設計選擇 &#x1f310; 在線資源速覽 類別地址訪問方…

【二】JavaScript能力提升---this對象

目錄 this的理解 this的原理 事件綁定中的this 行內綁定 動態綁定 window定時器中的this 相信小伙伴們看完這篇文章&#xff0c;對于this的對象可以有一個很大的提升&#xff01; this的理解 對于this指針&#xff0c;可以先記住以下兩點&#xff1a; this永遠指向一個…

使用vue3.0+electron搭建桌面應用并打包exe

使用vue3.0electron搭建桌面應用并打包exe_如何使用electron將vue3vite開發完的項目打包成exe應用程序-CSDN博客

linux如何判斷進程對磁盤是隨機寫入還是順序寫入?

模擬工具&性能測試工具&#xff1a;fio fio參數說明&#xff1a; filename/dev/sdb1&#xff1a;測試文件名稱&#xff0c;通常選擇需要測試的盤的data目錄。 direct1&#xff1a;是否使用directIO&#xff0c;測試過程繞過OS自帶的buffer&#xff0c;使測試磁盤的結果更真…

STM32基礎教程——對射式紅外傳感器計數實驗

前言 對射式紅外傳感器介紹 對射式紅外傳感器是一種非接觸式的距離檢測器&#xff0c;主要由發射器和接收器兩部分組成。發射器發出特定波長的紅外光束&#xff0c;當物體阻擋了這條光束時&#xff0c;接收器無法接收到光線信號&#xff0c;從而產生一個開關信號來判斷物體的存…

Hive-優化(語法優化篇)

列裁剪與分區裁剪 在生產環境中&#xff0c;會面臨列很多或者數據量很大時&#xff0c;如果使用select * 或者不指定分區進行全列或者全表掃描時效率很低。Hive在讀取數據時&#xff0c;可以只讀取查詢中所需要的列&#xff0c;忽視其他的列&#xff0c;這樣做可以節省讀取開銷…