Node.js使用websocket--简易聊天室小例子
程序员文章站
2022-03-12 20:59:46
WebSocketWebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。Node.js端Node.js这边使用的是ws库,可以直接npm install ws安装。然后我们创建一个app.js,初始化一些代码//server.jsvar websocketServer = require('ws').Server, wss = new websocket...
WebSocket
WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。
Node.js端
Node.js这边使用的是ws
库,可以直接npm install ws
安装。然后我们创建一个app.js
,初始化一些代码
//server.js
var websocketServer = require('ws').Server,
wss = new websocketServer({ port: 8033 })
var clients = [] //作为一个连接池,存储连接的用户信息
var cacheContent = [] //存储历史消息
var id = 0 //给每一个用户一个id
常用API
- connection 连接方法,有新的客户端接入就会触发这个方法,一般使用
wss.on('connection',function(ws){
//做一些初始化操作
})
- message 监听客户端发来的消息
wss.on('message',function(message){
//拿到消息message后进行一些操作
})
- close 监听客户端断开
wss.on('close',function(ws){
//客户端断开之后执行一些操作
})
- send 向客户端发送消息
wss.send(msg)
这里要注意的是若发送的数据不是基本数据类型,则需要用JSON.stringify(obj)
转化一下,即是
let obj = {name:'David',age:18}
wss.send(JSON.stringify(obj))
浏览器端
实例化一个WebSocket
var ws = new WebSocket(url)
url是服务端开启的socket服务地址
常用API
- onopen 初始化事件,刚连上的时候就会触发这个事件
ws.onopen = function(e){
console.log('连接到socket服务')
}
- onmessage 接收服务端发送来的信息
ws.onmessage = function(event){
console.log(event.data)
}
- close 断开连接事件
ws.onclose = function(e){
console.log(e)
console.log('连接断开')
}
简易聊天室栗子
话不多说,直接上代码吧,代码也非常简单,当做自己使用的一次记录,不得不说socket真是个好东西,双工通信的时候比轮询好多了,知道了基本的用法,想怎么拓展都可以了。
//index.html
<body>
<h2 id="id"></h2> //显示访问者的id
<input type="text" id="text" />
<input type="button" onclick="sendMessage()" value="发送" />
<div id="content"></div>
<script>
var ws = new WebSocket("ws://localhost:8033");
ws.onopen = function(e) {
console.log("连接到socket服务");
};
//这个接收消息方法要和服务端连起来一起看
ws.onmessage = function(event) {
let data = JSON.parse(event.data);
let type = data.type;
let id = data.id;
console.log(event);
switch (type) {
case "getId":
document.getElementById("id").innerHTML = `欢迎您,游客${id}`;
break;
case "getContent":
let content = data.content;
document.getElementById(
"content"
).innerHTML += `<div>游客${id}说:${content}<div>`;
break;
default:
break;
}
};
ws.onclose = function(e) {
console.log("连接断开");
};
//发送消息方法
function sendMessage() {
ws.send(document.getElementById("text").value);
document.getElementById("text").value = "";
}
</script>
</body>
服务端的代码如下
var websocketServer = require('ws').Server,
wss = new websocketServer({ port: 8033 })
//连接池
var clients = []
var cacheContent = []
var id = 0
wss.on('connection', function (ws) {
//将该连接加入连接池
let uid = id++
clients.push(ws)
//给新用户一个id
ws.send(JSON.stringify({ 'msg': '欢迎你', 'id': uid, 'type': 'getId' }))
//给新来的用户发送旧消息
getCacheContent(ws)
ws.on('message', function (message) {
clients.forEach(ws1 => {
let obj = {}
obj.content = message
obj.id = uid
obj.type = 'getContent'
cacheContent.push(obj)
ws1.send(JSON.stringify(obj))
})
})
//断开连接时将其移出
ws.on('close', function (ws) {
let clientIndex = clients.indexOf(ws)
clients.splice(clientIndex, 1)
})
})
function getCacheContent(ws){
cacheContent.forEach(item=>{
ws.send(JSON.stringify(item))
})
}
本文地址:https://blog.csdn.net/weixin_42684490/article/details/112571311