websocket+node實現一個最簡單的即時通訊功能
http與websocket區別:
http協議請求只能由客戶端向服務端發起請求才能獲取最新的狀態,因此為了保持最新狀態,客戶端需要不間斷的定期請求伺服器,即所謂的“輪詢”,相對於這種耗費資源的協議,webscoket實現了雙向傳送資訊,即伺服器可以向客戶端主動推送訊息,客戶端也可以向伺服器主動推送訊息,從而不必為了保持最新訊息的獲取而不斷的輪詢。
在即時通訊中,使用者A與使用者B之間的通訊的資訊傳遞必須通過伺服器進行,如果使用http協議,當使用者A給使用者B發傳送資訊時,A的資訊先到達伺服器,B的客戶端如果要獲取A的即時資訊,需要不斷的向伺服器請求判斷A是否發訊息來了,直到請求到最新訊息B的客戶端才會接收到;如果使用websocket協議,當A的訊息傳送給伺服器之後,伺服器會主動把A的最新訊息推送給B的客戶端,B的客戶端可以直接收到訊息而不需要不斷地請求伺服器。
HTML5提供了websocket通訊的API,可以用來做客戶端;
node的ws模組提供的websocket的通訊功能可以用來開發服務端;
先看程式碼:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>您有新訊息(1)</title>
</head>
<body>
<div>
<ul class="msgs">
<li>訊息內容</li>
</ul>
<div>
<input type="text" name="" class="con">
</div>
</div>
<script type="text/javascript">
var ul = document.querySelector('.msgs');
var input = document.querySelector('.con');
//連線伺服器
var ws = new WebSocket("ws://localhost:8003");
//連線成功觸發
ws.onopen = function(){
alert("連線成功");
}
//連線失敗觸發
ws.onerror = function(){
alert("連線失敗");
}
//接收訊息觸發
ws.onmessage = function(msg){
add(msg.data);
}
//新增內容
input.onkeydown = function(e){
if(e.keyCode == 13){
// add(this.value);
ws.send(this.value);
}
}
function add(con){
var li = document.createElement("li");
li.innerHTML = con;
ul.appendChild(li);
input.value = "";
}
</script>
</body>
</html>
node_server.js:
var server = require('ws').Server;
var ws = new server({
port:8003
});
var connNum = [];
//函式引數,連線的物件
ws.on("connection",function(socket){
connNum.push(socket);
console.log("連線了"+connNum.length);
//收到訊息傳送給每一個人
socket.on("message",function(msg){
//廣播給所有人
for (var i = 0; i < connNum.length; i++) {
connNum[i].send(msg);
}
})
// socket.send("傳送的訊息");
//斷開連線
socket.on("close",function(){
connNum.splice(connNum.indexOf(this),1);
})
})
實現功能:
當使用者開啟該頁面,立即建立了跟後端的通訊通道;
當使用者在input框中輸入文字並回車時,文字資料傳到後端;
後端將任何一個使用者傳送的資料廣播到開啟該客戶端每一個使用者的客戶端(該網頁)上,客戶端獲取後端傳送來的資料後展示在頁面上。
工具:
安裝node以及相應的ws模組。
程式碼地址:https://github.com/RidingACodeToStray/node_websocket
相關文章
- c#實現最簡單的socket通訊C#
- Java Websocket實現即時通訊功能入門教程JavaWeb
- 一套簡單的web即時通訊——第二版Web
- 透過.NET Core+Vue3 實現SignalR即時通訊功能VueSignalR
- 在鴻蒙開發中,如何實現一個簡單的應用間通訊(Event Bus)功能?鴻蒙
- SpringBoot整合開源IM框架MobileIMSDK,實現即時通訊IM聊天功能Spring Boot框架
- 一個簡單的netty通訊的例子Netty
- 小程式如何實現自動回覆訊息的功能?一個簡單的方法
- flutter 呼叫環信sdk 實現即時通訊Flutter
- TCP和UDP實現簡單一對一通訊TCPUDP
- 實現在安卓平臺下的即時通訊安卓
- 使用ABAP實現一個最簡單的區塊鏈原型區塊鏈原型
- 即時通訊
- 簡單的Java實現Netty進行通訊JavaNetty
- 實現一個簡單的TomcatTomcat
- 智慧家居簡單實現---使用ESP8266簡單實現和APP通訊APP
- 用Java程式碼實現一個簡單的聊天室功能Java
- 關於一個最簡單的數獨解題實現與疑惑一
- Laravel + Swoole + vue3 搭建一個簡易的前後即時通訊聊天專案LaravelVue
- 一對一直播交友原始碼實現即時通訊非常“有一套”原始碼
- 基於 go-Laravel-broadcast 實現 Laravel 的即時通訊(Broadcasting)GoLaravelAST
- 一個簡單的時間視窗設計與實現
- 簡單的實現一個原型鏈原型
- 實現一個簡單的MVVM(Compile)MVVMCompile
- php實現一個簡單的socketPHP
- 實現一個簡單的 RESTful APIRESTAPI
- 一個最簡單的web componentsWeb
- 造輪子系列(二): 史上最簡單的長連線通訊協議及實現協議
- 實現一個簡單的 jQuery 的 APIjQueryAPI
- 一個簡單API,一鍵實現多通道訊息推送API
- 黑科技!僅需 3 行程式碼,就能將 Gitter 整合到個人網站中,實現一個 IM 即時通訊聊天室功能?行程Git網站
- 300行ABAP程式碼實現一個最簡單的區塊鏈原型區塊鏈原型
- 使用rails實現最簡單的CRUDAI
- 實現最簡單的模板替換
- 在Unity中實現一個簡單的訊息管理器Unity
- 為自己搭建一個分散式 IM(即時通訊) 系統分散式
- 用 go 實現一個簡單的 mvcGoMVC
- 實現一個簡單的虛擬DOM