websocket聊天
代码
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
| const http = require("http"); const fs = require("fs"); const ws = require("socket.io");
const server = http.createServer((req, res) => { const html = fs.readFileSync("./client.html"); res.end(html); });
server.listen(8000, () => { console.log("服务运行在8000端口"); });
const io = ws(server);
io.on("connection", socket => { console.log("有新用户进入房间"); const id = socket.id; io.emit("message", id, `欢迎【${id}】进入房间`, true);
socket.on("message", mes => { console.log(id, mes); io.emit("message", id, mes); });
socket.on("disconnect", () => { console.log("有用户离开房间"); io.emit("message", id, `用户【${id}】离开房间`, true); }); });
|
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
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Node.js+WebSocket聊天室</title> <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/3.0.0-rc4/socket.io.js"></script> <style> .container { width: 800px; margin: 0 auto; text-align: center; } .message-form { display: flex; justify-content: center; align-items: center; } .me { color: blue; text-align: end; } .other { text-align: start; } .public { color: gray; font-size: small; } .public::before { content: "公告:"; } </style> </head> <body> <div class="container"> <h1>SocketIO聊天室</h1> <form class="message-form" action="#" onsubmit="sendMessage(event)"> <textarea class="message" name="message" placeholder="按Ctrl+enter发送消息" rows="1" cols="30" required oninvalid="setCustomValidity('请先输入消息内容')" oninput="setCustomValidity('')" ></textarea> <button class="send">发送</button> </form> <div class="messages"> <p class="public">欢迎来到聊天室</p> </div> </div> <script> const socket = io.connect("/"); const mesForm = document.querySelector(".message-form");
document.addEventListener("keydown", e => { if (e.keyCode === 13 && e.ctrlKey) { sendMessage(e); } });
function sendMessage(e) { e.preventDefault(); const mes = mesForm.message.value; socket.send(mes); mesForm.message.value = ""; }
socket.on("message", (id, mes, is = false) => { const p = document.createElement("p"); p.innerText = is ? mes : `【${id}】:${mes}`; p.classList.add(is ? "public" : id === socket.id ? "me" : "other"); const messages = document.querySelector(".messages"); messages.append(p); }); </script> </body> </html>
|
package.json
1 2 3 4 5 6 7
| { "dependencies": { "express": "^4.18.2", "nodejs-websocket": "^1.7.2", "socket.io": "^4.5.4" } }
|
运行
启动方式:
1 2 3
| $ npm i
$ node server.js
|
地址: http://localhost:8000
相关资料
运行效果
