HTML5 - Websocket
<p></p><p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)">关键词:</span></h2>
<ul type="disc">
<li lang="en-US">HTML5</li>
<li>网络通讯协议</li>
<ul type="circle">
<li><span lang="zh-CN">并肩HTTP</span></li>
</ul>
<li>基于TCP</li>
<li><span lang="zh-CN">客户端与服务器<span lang="en-US"> <span lang="zh-CN">全双工通讯</span></span></span></li>
<ul type="circle">
<li>双向数据传输</li>
</ul>
<li>实现长链接、持久性链接</li>
<ul type="circle">
<li>HTTP是非持久性</li>
</ul>
</ul>
<p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)">总结:</span></h2>
<p>Websocket是一种在单个TCP连接上进行全双工通讯的协议,他能够允许服务端主动向客户端推送数据。</p>
<p>在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。</p>
<p>(在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。)</p>
<p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)">作用:</span></h2>
<p>实现推送技术</p>
<p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)">优点:</span></h2>
<p>节省服务器资源和带宽,并且能够更实时地进行通讯</p>
<p> </p>
<p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)">应用:聊天室</span></h2>
<p>传统HTTP协议要实现聊天室功能需要用到AJAX轮询</p>
<p><span lang="zh-CN">Websockets协议<span lang="en-US">实现聊天室功能很简单<span lang="zh-CN">。</span></span></span></p>
<p></p>
<p></p>
<h2>AJAX轮询原理:</h2>
<p>轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。返回之后,链接断开。下次通讯需要重新发送ajax请求了。</p>
<p>这种传统的模式带来很明显的缺点。</p>
<p>AJAX轮询缺点:即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。</p>
<p> </p>
<p>ajax轮询与Websockets长连接 </p>
<h2>二者原理图对比:</h2>
<p></p>
<p><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606223853131-1992551348.png" alt="" width="518" height="276"></p>
<p> </p>
<p></p>
<p><span lang="en-US">websockets建立一次链接<span lang="zh-CN">,长久通讯;</span></span></p>
<p>ajax轮询需要每秒发送一次请求。每请求一次都要三次握手。请求完毕就会断开链接,每断开一次都要四次挥手;啊哈哈哈。</p>
<p> </p>
<p>性能来说,Websocket更优。</p>
<h2> </h2>
<p> </p>
<h2><span style="color: rgba(255, 102, 0, 1)" lang="zh-CN">Websocket<span lang="en-US"> API 使用方法<span lang="zh-CN">:</span></span></span></h2>
<p>一、创建</p>
<p></p>
<p><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606223941414-1395108427.png" alt="" width="615" height="196"></p>
<p></p>
<p> </p>
<p>二、事件</p>
<p><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606224019563-689920977.png" alt="" width="644" height="205"></p>
<p> </p>
<p></p>
<p>open:当客户端和Websocket服务端连接成功的时候就会触发</p>
<p>事件需要用addEventListener绑定:比如open事件注册示例</p>
<div class="cnblogs_code">
<pre>websocket.addEventListener('open',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
console.log(e,websocket.readyState);
});</span></pre>
</div>
<p> </p>
<p>客户端接受到服务器返回的数据时,会触发message事件,所以我们监听这个事件并注册回调函数就行:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> websocket.addEventListener('message',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(event){
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">console.log(event);
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> console.log(event.data);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> event里的data属性,就是服务器返回的数据</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> });</pre>
</div>
<p> </p>
<p>close就是连接断开的时候出发的事件,同上绑定方法。</p>
<p> </p>
<p> </p>
<p></p>
<p><span lang="en-US">三<span lang="zh-CN">、属性</span></span></p>
<p><span lang="en-US"><span lang="zh-CN"></span></span><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606224038999-107092592.png" alt="" width="643" height="353"></p>
<p> </p>
<p> </p>
<p>四、方法</p>
<p><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606224101274-943140951.png" alt="" width="635" height="237"></p>
<p> </p>
<p><span lang="zh-CN">send<span lang="en-US">()<span lang="zh-CN">:<span lang="en-US">客户端主动向服务端发送消息</span></span></span></span></p>
<p><span lang="en-US">send<span lang="en-US">使用演示 - 比如在链接成功后<span lang="zh-CN">,发送一端文案过去:</span></span></span></p>
<div class="cnblogs_code">
<pre>websocket.addEventListener('open',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
console.log(e,websocket.readyState);
websocket.send(</span>'发送一个方法'<span style="color: rgba(0, 0, 0, 1)">)
});</span></pre>
</div>
<p> </p>
<p lang="en-US"> </p>
<p><span lang="en-US">五<span lang="zh-CN">、其他api讲解可以看MDN</span></span></p>
<p> </p>
<h2> </h2>
<h2> </h2>
<h2><span style="color: rgba(255, 102, 0, 1)" lang="zh-CN">控制台查看<span lang="en-US">websocket<span lang="zh-CN">请求发送的情况:</span></span></span></h2>
<p><img src="https://img2018.cnblogs.com/blog/956663/201906/956663-20190606224122863-854319890.png" alt="" width="651" height="281"></p>
<p></p>
<p>绿色表示发送,红色表示接受的。</p>
<p>ps:图中之所以长这样(指请求和响应的文案都一样),是因为我们借用官网的echo这个服务器,是我们给他发送啥,他就原封不动给我们返回啥。</p>
<p></p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
越努力,越幸运;阿门。<br><br>
来源:https://www.cnblogs.com/padding1015/p/10987168.html
頁:
[1]