前言
这个小Demo是在复习原生JavaScript时一道练习的高级版,本来是想着照着原来做出来就好了,但觉得好像有没什么意思。由于之前有了解过WebSocket的通讯原理,还有最近在学习node.js,结合网上的一些资料,于是就把这道题升级一下。
效果

代码
服务端代码
// 加载 koa2 相关依赖
let Koa = require("koa2");
let WebSocket = require("koa-websocket");
// 实例化 WebSocket, 并创建接收消息数组
let app = WebSocket(new Koa());
let ctxs = [];
// 简单的消息收发
app.ws.use((ctx, next) => {
// 接收到的消息
ctxs.push(ctx);
ctx.websocket.on("message", (message) => {
console.log(message);
for(let i = 0; i < ctxs.length; i++) {
if (ctx == ctxs[i]) continue;
ctxs[i].websocket.send(message);
}
});
ctx.websocket.on("close", (message) => {
// 关闭时清除相关数据,防止出错
let index = ctxs.indexOf(ctx);
ctxs.splice(index, 1);
});
});
// 端口监听
app.listen(3000);
html 代码
ps : 创建两个html文件,代码内容都相同。就可以实现两个人之间的聊天了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>前端切图工程师</title>
<style>
.chat-room
{
width: 250px;
height: 500px;
padding: 10px;
border: 1px solid #ddd;
position: relative;
margin: 0 auto;
overflow: hidden;
}
.chat-content
{
width: 100%;
height: 450px;
overflow:auto;
}
.chat-op
{
position: absolute;
bottom: 0;
left: 0;
}
.me-item
{
text-align: right;
}
</style>
</head>
<body>
<div class="chat-room">
<div class="chat-content" id="chatContent">
</div>
<div class="chat-op">
<input type="text" id="content" />
<input type="button" value="发送" id="send" />
<input type="button" value="关闭" id="close" />
</div>
</div>
</body>
<script type="text/javascript">
var chatContent = document.getElementById('chatContent');
var oContent = document.getElementById('content');
/* 封装 WebSocket 实例化的方法 */
var CreateWebSocket = (function () {
return function (urlValue) {
if(window.WebSocket) return new WebSocket(urlValue);
if(window.MozWebSocket) return new MozWebSocket(urlValue);
return false;
}
})();
//实例化 WebSocket 并且连接服务器
var webSocket = CreateWebSocket("ws://localhost:3000");
/* 接收到服务端的消息时 */
webSocket.onmessage = function (msg) {
console.log("接收到新消息:" + msg.data);
let oFriendItem = document.createElement('div');
oFriendItem.className = 'friedns-item';
let oSpan = document.createElement('span');
oSpan.className = 'friedns';
let message = document.createTextNode(msg.data);
oSpan.appendChild(message);
oFriendItem.appendChild(oSpan);
chatContent.appendChild(oFriendItem);
// 聊天内容置底部
chatContent.scrollTop = chatContent.scrollHeight;
};
// 关闭时
webSocket.onclose = function () {
console.log("关闭连接");
};
// 发送消息
document.getElementById("send").onclick = function () {
var str = document.getElementById("content").value;
let oMeItem = document.createElement('div');
oMeItem.className = 'me-item';
let oSpan = document.createElement('span');
oSpan.className = 'me';
let msg = document.createTextNode(oContent.value);
oSpan.appendChild(msg);
oMeItem.appendChild(oSpan);
chatContent.appendChild(oMeItem);
oContent.value = '';
// 聊天内容置底部
chatContent.scrollTop = chatContent.scrollHeight;
webSocket.send(str);
};
//关闭
document.getElementById("close").addEventListener("click", function () {
webSocket.close();
});
</script>
</html>
参考资料:
感谢博客园的大神,https://www.cnblogs.com/lovling/p/7440360.html