简易聊天室
前置知识
- 在我们平常的时候,ajax发送的都是短连接,get完成或者post完成之后连接就断开,并且当服务器数据更新的时候,必须再次发送ajax请求才可以获取到最新的数据
- 在没有socket之前,要实时获取服务器的数据,必须要轮询,也就是每隔一段时间发送ajax
- 所以现在有了服务端主动向前端推送消息的东东——长连接socket
- 实现的二种方式
- socket.io
- websocket(H5新增)
这里使用socket.io实现
socket.io的具体使用并没有想象的难记,而是on和emit这二个关键字贯穿始终
on就用来订阅服务器发送的消息(服务端当中的理解就是监听用户发送服务端的信息)
emit就用来用户向服务器发送信息(服务端当中的理解就是向用户发送信息)
socket.io大概过程
前端设置
引入<script src="./socket.io.js"></script>
使用io.connect(url)连接socket服务器
使用on监听和emit发送
前端代码
index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| <!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> <script src="./jquery-3.6.0.js"></script> <script src="./socket.io.js"></script> <style> * { margin: 0; padding: 0; }
.wrap { width: 400px; height: 450px; margin: 50px auto; box-shadow: 0 0 4px rgba(0, 0, 0, 0.4); }
.wrap>.content { width: 100%; height: 300px; box-sizing: border-box; padding: 20px 10px 8px 10px; background-color: #e2e1e2; overflow-x: auto; overflow-x: hidden; }
.wrap>.content .left { font-size: 15px; padding: 5px 4px; border-radius: 4px; clear: both; margin: 5px 0; background-color: #c5cdd6; max-width: 300px; float: left; }
.wrap>.content .right { font-size: 15px; padding: 5px 4px; border-radius: 4px; clear: both; margin: 5px 0; background-color: #8dcced; max-width: 300px; float: right; }
.wrap>.input { width: 100%; height: 100px; }
.wrap>.input #ipt { width: 100%; height: 100%; }
.wrap>.ope { height: 50px; }
.wrap>.ope #send { padding: 10px; float: right; } </style> </head>
<body> <div class="wrap"> <div class="content"> </div> <div class="input"> <textarea id="ipt"></textarea> </div> <div class="ope"> <button id="send">发送</button> </div> </div>
<script> var $inputs = $("#ipt"); var $send = $("#send"); var $content = $(".content").eq(0); var socket = io.connect("http://localhost:8888"); socket.on("serverInfo", (data) => { $('<p class="left">' + data + '</p>').appendTo($content); }) $inputs.keyup(function (e) { if ($inputs.val().trim() && e.keyCode == 13) { $send.click(); } }) $send.click(function () { var value = $inputs.val(); if (value) { $('<p class="right">' + value + '</p>').appendTo($content); socket.emit("userMessage", value); $inputs.val(""); } else { alert("输入框为空!"); } }) </script> </body>
</html>
|
后端代码
server.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| const express = require("express"); const app = express();
app.use("/", express.static(__dirname)); const server = require("http").Server(app); const websocket = require("socket.io")(server);
var clientCache = [];
websocket.on("connection", (client) => { clientCache.push(client); client.on("userMessage", (data) => { clientCache.forEach((ele) => { if (ele != client) { ele.emit("serverInfo", data); } }) })
})
server.listen("8888", () => { console.log("---------server start--------------"); });
|
效果图
娱乐一刻
"今天你约我去陪你买衣服,尽管我知道只是因为我的身形像你异地的男朋友,比较好试衣服而已。买完衣服,寄快递写他名字的时候,看见你嘴角翘起幸福的笑来。那一刻,我多希望我可以也叫那个名字,哪怕只有一分钟!!"