前言
在实现聊天室之前,我们需要先简单了解websocket是什么?为什么要用到websocket实现聊天室功能?
一、websocket是什么?
websocket是一种全双工通信的协议。全双工通信即允许数据在两个方向上同时传输,当A?B的同时B?A。 而websocket的全双工具体是体现在了客户端和服务端的双向交流 上。 这里用轮询来举例说明:轮询是在特定的的时间间隔(如每1秒),由客户端对服务端发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。也就是说如果没有客户端向服务端发送请求,服务端不会主动向客户端提供新的数据 。
而websocket的全双工就体现在这里,只要客户端向服务端发送一次请求,之后有任何的数据改变服务端都会主动 向客户端提供。
因此我们用到websocket来实现聊天室功能。
二、实现步骤
1.创建项目框架
首先创建一个文件夹,命名chat-room(可以不取这个名字) 进入到文件夹中,打开cmd,生成package.json并安装websocket。
npm init -y npm i socket.io --save
最后生成文件夹内如下所示 接着创建websocket服务端,命名为server.js ,代码如下:
var http = require('http');
var fs = require('fs');
var ws = require('socket.io');
var server = http.createServer(function(req,res){
var html = fs.readFileSync('./client.html');
res.end(html);
}).listen(8080);
var io = ws(server);
io.on('connection',(socket)=>{
console.log('有新用户进入房间');
socket.on('message',(obj)=>{
console.log(obj);
io.emit('message',obj);
})
})
接着创建传送给客户端的文件client.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>聊天室</title>
</head>
<body>
<h2>聊天室</h2>
<textarea id="text" cols="30" rows="10"></textarea>
<button id="btn">发送</button>
<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.5.2/socket.io.js"></script>
<script>
var socket = io.connect('/');
var text = document.getElementById('text');
var btn = document.getElementById('btn');
var myMessage = '';
btn.onclick = function(){
var mes = text.value;
myMessage = mes;
socket.send(mes);
text.value = '';
}
socket.on('message',(mes)=>{
var p = document.createElement('p');
p.innerText = mes;
if(myMessage == mes){
p.style.cssText = 'color:red;margin-left:200px';
}
document.body.appendChild(p);
})
</script>
</body>
</html>
最后,在cmd运行node server
2.运行结果
|