日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

websocket实现聊天室(一)

發(fā)布時(shí)間:2023/12/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 websocket实现聊天室(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????????最近接到一個(gè)聊天室的任務(wù),之前在學(xué)校完全沒(méi)有接觸過(guò)這方面的需求,在網(wǎng)上查找資料后,基本確定了實(shí)現(xiàn)方案,現(xiàn)在就開(kāi)始著手學(xué)習(xí),在此記錄一下遇到的問(wèn)題。

初識(shí)websocket

??????? 在簡(jiǎn)單了解websocket后,我覺(jué)得與http請(qǐng)求類(lèi)似,不過(guò)websocket可以實(shí)現(xiàn)在客服端向服務(wù)器發(fā)一次請(qǐng)求之后,就會(huì)建立一個(gè)不會(huì)中斷的通訊,這樣實(shí)現(xiàn)聊天室就不需要像http請(qǐng)求那樣,你需要隔一段時(shí)間就向服務(wù)器發(fā)一次請(qǐng)求,詢(xún)問(wèn)是否有發(fā)給我的消息。

H5中使用websocket

??????? H5中提供了websocket的API,我們可以直接使用。

主要就是四部曲:

1、創(chuàng)建websocket(這里有一個(gè)問(wèn)題,我參考資料中websocket服務(wù)地址使用的是ws://echo.websocket.org,但我使用的時(shí)候報(bào)了個(gè)錯(cuò),貌似是被攔截器攔截了,沒(méi)有找到解決辦法,所以直接使用的自己本地創(chuàng)建的websocket的服務(wù)地址,本篇后面也會(huì)介紹如何創(chuàng)建一個(gè)簡(jiǎn)單的本地的websocket服務(wù))

// 1、創(chuàng)建websocket// 參數(shù):websocket的服務(wù)地址var socket = new WebSocket("ws://localhost:3000");

2、注冊(cè)一個(gè)open事件,在連接創(chuàng)建時(shí)觸發(fā)的事件

// 2、open:當(dāng)和websocket的服務(wù)器連接成功時(shí)觸發(fā)socket.addEventListener("open", () => {// 將服務(wù)器連接成功的信息打印到div中div.innerHTML = "服務(wù)器連接成功了!";});

3、注冊(cè)一個(gè)send事件,發(fā)送數(shù)據(jù)給服務(wù)器

// 3、 send:發(fā)送數(shù)據(jù)給服務(wù)器button.addEventListener("click", () => {// 獲取輸入框中的數(shù)據(jù)var value = input.value;// 調(diào)用send方法將數(shù)據(jù)發(fā)送給服務(wù)器socket.send(value);});

4、注冊(cè)一個(gè)message事件,接收服務(wù)器數(shù)據(jù)

// 4、message:接收服務(wù)器數(shù)據(jù)socket.addEventListener("message", (e) => {// 將接收到的數(shù)據(jù)顯示出來(lái)div.innerHTML = e.data;});

????????這樣客戶(hù)端(瀏覽器)簡(jiǎn)單的流程就走完了,接下來(lái)就是搭建一個(gè)本地的websocket服務(wù)。

搭建一個(gè)本地的websocket服務(wù)

?????????這里我是用的方式是用nodejs-websocket進(jìn)行搭建,使用說(shuō)明文檔地址:?ddwsnodejs-websocket - npm

按照官方的教程進(jìn)行搭建就可以。

1、首先我們需要安裝nodejs-websocket的依賴(lài)

npm install nodejs-websocket

2、創(chuàng)建一個(gè)server.js,引入nodejs-websocket包

// 1、 導(dǎo)入nodejs-websocket包 const ws = require("nodejs-WebSocket");

3、創(chuàng)建一個(gè)server

// 創(chuàng)建一個(gè)server const server = ws.createServer((conn) => {console.log("有用戶(hù)連接上來(lái)了!");// 接收到客戶(hù)端發(fā)送的數(shù)據(jù)時(shí)觸發(fā)conn.on("text", (data) => {broadcast(data);});// 連接斷開(kāi)時(shí)觸發(fā)conn.on("close", (data) => {broadcast(data);});// 異常時(shí)觸發(fā)conn.on("error", (data) => {console.log("發(fā)生異常!");});}).listen(PORT, () => {console.log("websocket服務(wù)器動(dòng)起來(lái)了!監(jiān)聽(tīng)了端口:" + PORT);});

????????這里有一個(gè)需要注意的地方,注冊(cè)close事件時(shí),也需要將error事件注冊(cè),因?yàn)榘l(fā)生close事件時(shí),會(huì)發(fā)生異常,若沒(méi)有注冊(cè)error事件,服務(wù)器就會(huì)停止運(yùn)行。

4、將接收到的數(shù)據(jù)發(fā)送給所有人(廣播)

// 廣播方法 function broadcast(msg) {server.connections.forEach((item) => {item.send(JSON.stringify(msg));}); }

?這樣一個(gè)簡(jiǎn)單的websocket服務(wù)器就搭建完成了。

下面把兩個(gè)完整的代碼貼出來(lái)

index.html

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>div {width: 200px;height: 400px;border: 1px solid;}</style></head><body><!-- 顯示內(nèi)容 --><div></div><!-- 輸入內(nèi)容 --><input type="text" placeholder="請(qǐng)輸入要發(fā)送的內(nèi)容" /><!-- 發(fā)送按鈕 --><button>發(fā)送</button><script>var input = document.querySelector("input");var button = document.querySelector("button");var div = document.querySelector("div");// 1、創(chuàng)建websocket// 參數(shù):websocket的服務(wù)地址var socket = new WebSocket("ws://localhost:3000");// 2、open:當(dāng)和websocket的服務(wù)器連接成功時(shí)觸發(fā)socket.addEventListener("open", () => {div.innerHTML = "服務(wù)器連接成功了!";});// 3、 send:發(fā)送數(shù)據(jù)給服務(wù)器button.addEventListener("click", () => {var value = input.value;socket.send(value);console.log(value);});// 4、message:接收服務(wù)器數(shù)據(jù)socket.addEventListener("message", (e) => {div.innerHTML = JSON.parse(e.data);});</script></body> </html>

server.js

?

// 1、 導(dǎo)入nodejs-websocket包 const ws = require("nodejs-WebSocket"); const PORT = 3000;let count = 0; // 創(chuàng)建一個(gè)server const server = ws.createServer((conn) => {console.log("有用戶(hù)連接上來(lái)了!");count++;conn.userName = "用戶(hù)" + count;broadcast(conn.userName + "進(jìn)入了聊天室");// 接收到客戶(hù)端發(fā)送的數(shù)據(jù)時(shí)觸發(fā)conn.on("text", (data) => {broadcast(data);});// 連接斷開(kāi)時(shí)觸發(fā)conn.on("close", (data) => {count--;broadcast(data);});// 異常時(shí)觸發(fā)conn.on("error", (data) => {console.log("發(fā)生異常!");});}).listen(PORT, () => {console.log("websocket服務(wù)器動(dòng)起來(lái)了!監(jiān)聽(tīng)了端口:" + PORT);});// 廣播方法 function broadcast(msg) {server.connections.forEach((item) => {item.send(JSON.stringify(msg));}); }

運(yùn)行

????????命令提示符進(jìn)入到server.js的目錄下,node .\server.js,然后打開(kāi)index.html即可

?????????這篇只是完成了一個(gè)最簡(jiǎn)單的聊天室功能,聊天歷史記錄、區(qū)分消息類(lèi)型、定位到最新一條消息、發(fā)送圖片表情等都沒(méi)有實(shí)現(xiàn),接下來(lái)就是按著微信聊天對(duì)功能進(jìn)行優(yōu)化。

總結(jié)

以上是生活随笔為你收集整理的websocket实现聊天室(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。