WebSocket与即时通讯
HTTP 协议有一个缺陷:通信只能由客户端发起!HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室!
WebSocket 是一种网络通信协议,很多高级功能都需要它!它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。其他特定包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws
(如果加密,则为wss
),服务器网址就是 URL。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> #box { width: 500px; } .container { height: 350px; border: 1px solid #ccc; overflow-y: auto; } .container .tips { text-align: center; justify-content: center; font-size: 12px; color: #ccc; } .container p:nth-child(1) { display: flex; justify-content: space-between; } p span:nth-child(1) { display: inline-block; width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } p span:nth-child(2) { max-width: 240px; background: limegreen; color: #fff; padding: 5px; border-radius: 5px; word-break: break-all; margin-left: 10px; } .container div { display: flex; justify-content: space-between; } .send { display: flex; justify-content: space-between; } .send input { flex: 1; height: 50px; } ::-webkit-scrollbar { display: none; } </style> </head> <body> <!-- 如: 聊天室功能 在websocket之前,通过ajax轮询的方式实现 websocket: 双向实时通讯技术(服务器可以主动发送消息给,客户端可以主动发送消息给服务器) nodejs环境: 1.进入nodejs官网,安装nodejs: https://nodejs.org/en/download/ 2.打开cmd, 输入: node -v 测试是否安装成功(出现版本号即安装成功,否则步骤3) 3.配置环境变量: 计算机--属性--高级系统配置--环境变量--Path--将nodejs安装目录添加到Path后面,用分号与前面的Path分开 启动服务器: 在命令行输入: node wsServer.js --> <div id="box"> <div class="container"> </div> <div class="send"> <input type="text" name="" id="" value="" /> <button type="button">发送消息</button> </div> </div> <script type="text/javascript"> var oBox = document.querySelector(".container"); var oVal = document.querySelector("input"); var oSend = document.querySelector("button"); // 1.创建连接() var ws = new WebSocket("ws://8.135.39.102:8080"); // 2.连接已建立 ws.onopen = function () { console.log("连接已建立"); } // 4.接收消息 ws.onmessage = function (ev) { var newDiv = document.createElement("div"); if (ev.data.search("tips") != -1) { newDiv.innerHTML = ev.data; newDiv.className = "tips"; } else { var data = JSON.parse(ev.data); var time = new Date().toLocaleTimeString(); newDiv.innerHTML = ` <p> <span>${data.nickname}</span> <span>${data.msg}</span> </p> <p>${time}</p> ` } oBox.appendChild(newDiv); oBox.scrollTop = oBox.scrollHeight; } // 5.关闭连接 ws.onclose = function () { console.log("连接已关闭"); } oSend.onclick = function () { var val = oVal.value; if (val) { // 3.发送消息 ws.send(val); oVal.value = ""; } } </script> </body> </html>