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

WebSocket 入門:簡易聊天室

開發 前端
WebSocket 是一個應用層協議,有點類似 HTTP。但和 HTTP 不一樣的是,它支持真正的全雙工,即不僅客戶端可以主動發消息給服務端,服務端也可以主動發消息給客戶端。

大家好,我是前端西瓜哥,今天我們用 WebSocket 來實現一個簡單的聊天室。

WebSocket 是一個應用層協議,有點類似 HTTP。但和 HTTP 不一樣的是,它支持真正的全雙工,即不僅客戶端可以主動發消息給服務端,服務端也可以主動發消息給客戶端。

尤其是后者,讓我們不用再基于 HTTP 長輪詢或短輪詢的低效方式來實現服務端通知。相比 HTTP,WebSocket 的服務端推送更輕量,并能減少服務端的壓力。

服務端

nodejs 并沒有提供原生的 WebSocket 模塊。如果要實現,需要基于 net 模塊,根據 WebSocket 標準去做實現。

因為實現很復雜,所以西瓜哥我選擇直接用第三庫 ws。

yarn add ws

類似 nodejs 原生的 http 等模塊,ws 庫支持 WebSocket 的服務端或客戶端, 提供偏底層的 API。

我們先實現服務端代碼:

import { WebSocketServer } from "ws";

// 創建一個 ws 服務
const wsSever = new WebSocketServer({
port: 6060,
});

// 每當一個客戶端進行了 ws 連接,就會創建一個 ws 對象
wsSever.on("connection", (ws) => {
// 新客戶端連接時,廣播
wsSever.clients.forEach((client) => {
client.send(`有人進入聊天室,當前聊天室人數:${wsSever.clients.size}`);
});

// 廣播任何客戶端發送的消息
ws.on("message", (data) => {
const msg = data.toString();
wsSever.clients.forEach((client) => {
client.send(msg);
});
});

// 當有客戶端退出時,廣播
ws.on("close", () => {
wsSever.clients.forEach((client) => {
client.send(`有人退出了聊天室,當前聊天室人數:${wsSever.clients.size}`);
});
});
});

每當一個客戶端進行了 websocket 連接,都會觸發 wsServer 的 connection 事件,然后拿到一個 ws 對象。

這個 ws 對象代表了某個客戶端和服務端的連接,我們可以通過它來接收對應客戶端的消息,并讓服務端對指定客戶端進行主動消息推送。

新創建的 ws 對象會在建立連接時保存到 wsServer.clients 集合下,并在關閉連接后移除。所以我們可以利用這個 wsServer.clients 來進行廣播,實現聊天室功能。

客戶端

客戶端使用原生的 WebSocket 對象,來和服務端進行 WebSocket 連接。

const ws = new WebSocket('ws://localhost:6060');

ws.addEventListener('message', (event) => {
const div = document.createElement('div');
div.innerText = event.data;
document.body.append(div);
})

// 點擊發送按鈕,將輸入框中的內容發送給服務器
const input = document.querySelector('input');
const btn = document.querySelector('button');
btn.onclick = () => {
ws.send(input.value);
input.value = '';
}

效果

圖片

簡易聊天室

改為使用 Socket.IO

ws 庫是偏底層的實現,比較簡單。

另一個庫 Socket.IO 的底層使用了 ws,并做功能上的增強,提供更多的能力。

相比 ws,Socket.IO 能夠做到:

  1. 如果瀏覽器不支持 WebSocket,回退為 HTTP 長輪詢方案來模擬 WebSocket( WebSocket 于 2011 年完成 RFC,已經很久了,目前來說主流瀏覽器都已經支持 WebSocket 了,還不支持 WebSocket 的瀏覽器是屑)。
  2. 使用心跳包機制實現了自動重連。
  3. 包緩存。斷連時發送數據,會將數據保存下來,等重新連接后再發送。
  4. 自定義事件支持。
  5. 廣播。

相比自己去一個個實現,使用流行的輪子可能是更好的選擇。

我們將前面的功能用 Socket.IO 實現一下。

服務端:

import { Server } from "socket.io";

// socket.io v3.x 開始默認不允許跨域,需要在配置顯式設置為允許跨域
const io = new Server(6060, { cors: { origin: "*" } });

io.on("connection", (socket) => {
// 新客戶端連接時,廣播
io.emit("chat", `有人進入聊天室,當前聊天室人數:${io.engine.clientsCount}`);

// 廣播任何客戶端發送的消息
socket.on("chat", (data) => {
io.emit("chat", data);
});

// 當有客戶端退出時,廣播
socket.on("disconnect", () => {
io.emit("chat", `有人退出了聊天室,當前聊天室人數:${io.engine.clientsCount}`);
});
});

需要特別注意的是,Socket.IO 的 v3.x 版本開始,默認不允許跨域,需要在配置顯式設置為允許跨域。

客戶端:

const socket = io('ws://localhost:6060');

socket.on('chat', (data) => {
const div = document.createElement('div');
div.innerText = data;
document.body.append(div);
})

// 點擊發送按鈕,將輸入框中的內容發送給服務器
const input = document.querySelector('input');
const btn = document.querySelector('button');
btn.onclick = () => {
console.log('發送');
socket.emit('chat', input.value);
input.value = '';
}

Socket.IO 優點是實現了生產環境需要的底層非業務能力,讓我們能更心無旁騖地去編寫業務代碼。

缺點是丟失了靈活性。因為做了定制化,所以需要配套使用 Socket.IO 的客戶端和服務端庫的包,某種意義脫離了網絡協議標準。在出現跨語言(比如前端是 JS,后端是 Java)的場景時,需要提供對應的語言的 Socket.IO 實現。

demo

demo 已經放到 github 上了,使用方法在 README.md 中有說明。

https://github.com/F-star/websocket-chat-demo

結尾

本文演示了 WebSocket  簡易的聊天室功能是如何實現的,希望對你有所幫助。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2022-07-26 14:53:10

WebSocket網絡通信協議

2023-01-05 09:17:58

2023-01-13 00:02:41

2025-05-09 08:35:00

聊天室FastAPIWebSocket

2011-12-15 11:11:51

JavaNIO

2021-10-14 18:46:29

Websocket瀏覽器API

2015-07-06 10:42:18

PHP聊天室應用

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2022-11-14 08:01:48

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應用

2024-01-18 11:15:46

Pythonsocket聊天室

2021-02-06 23:26:25

聊天室開發WebSocket

2025-06-09 02:00:00

項目技術棧Spring

2013-11-27 10:46:31

JavaEEWebsockets

2024-10-07 10:45:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 激情欧美一区二区三区中文字幕 | 国产精品毛片一区二区在线看 | 男女深夜网站 | 午夜精品久久久久久久星辰影院 | 91精品国产乱码久久久久久久久 | 国产精品不卡 | 亚洲精品中文字幕在线 | 免费国产一区二区 | 黄色大片视频 | 久久成人av | 91视频精选 | 欧美成人a | 国产一级黄色网 | 国产福利视频 | 国产亚洲精品美女久久久久久久久久 | 日韩视频区 | 亚洲午夜视频 | 一级黄色绿像片 | 一区二区三区在线 | 精品视频在线免费观看 | 91色在线| 视频一区二区在线观看 | 一区精品视频在线观看 | 日韩精品影院 | 中文字幕二区 | 7777精品伊人久久精品影视 | 国产精品久久久久久久久久免费看 | 日韩视频在线播放 | 久久精品 | 中文天堂在线一区 | 中文字幕伊人 | 日韩视频在线播放 | 日韩毛片视频 | 日韩电影a| 精品在线一区 | 日韩欧美一级精品久久 | 日韩综合色 | 国产精品视频在线观看 | 永久免费视频 | 日本三级电影免费观看 | 日本特黄特色aaa大片免费 |