一叶居 發表於 2021-8-16 15:35:00

HTML5(十一)——WebSocket 基础教程

<h1 class="pgc-h-arrow-right" data-track="1">一、为什么要学 WebSocket?</h1>
<p data-track="2">websocket 是 HTML5 提供的一种长链接双向通讯协议,使得客户端和服务器之间的数据交换更简单,允许服务端主动向客户端推送数据,并且客户端与服务端只需连接一次,就可以保持长久连接,并进行数据通信。</p>
<p data-track="3">websocket 与 http 区别:</p>
<ul>
<li data-track="4">http 链接分为长链接、短链接,短链接是发送一个请求,返回一个响应,长链接是在一定周期内保持链接。但是 websocket 只需连接一次就可以保持长链接,不需要的时候可以手动断开。</li>
<li data-track="6">http 通信中,客户端是主动的,服务端是被动的。但是 websocket,服务端可以主动向客户端推送数据。</li>
<li data-track="7">http 通过轮询建立的长链接,多次建立 request / response 会产生冗余的头部信息。</li>
</ul>
<p data-track="46">ajax 轮询与 websocket 通信原理如图:</p>
<p class="pgc-p syl-page-br" data-track="47">&nbsp;</p>
<div class="pgc-img"><img alt="HTML5(十一)——WebSocket 基础教程" class="syl-page-img lazyload" data-src="https://p3-tt.byteimg.com/origin/pgc-image/4c5e80508e2d4b67bc1d12705a6b07de?from=pc">
<p class="pgc-img-caption">&nbsp;</p>
</div>
<p class="pgc-p syl-page-br" data-track="48">&nbsp;</p>
<p data-track="8">websocket 就是为了解决客户端发起多个 http 请求到服务器资源,浏览器必须要经过长时间的,轮询问题而生的,实现多路复用。它最大特点就是服务器可以主动向客户端推送信息。</p>
<h1 class="pgc-h-arrow-right" data-track="51">二、WebSocket 对象</h1>
<p data-track="12">2.1、创建对象:</p>
<pre class="syl-page-code hljs cs"><code><span class="hljs-keyword">let ws = <span class="hljs-keyword">new WebSocket( url , [ protocol ] )</span></span></code></pre>
<p data-track="10">url:指定连接的后台服务地址。</p>
<p data-track="14">protocol:指定可接受的子协议,是可选参数。</p>
<p data-track="15">2.2、对象属性</p>
<p data-track="17">readyState:表示连接状态,是一个只读属性。</p>
<p data-track="18">使用语法:ws.readyState</p>
<p data-track="19">返回的值有4个,分别表示的意义:</p>
<ul>
<li data-track="20">0 - 未建立连接</li>
<li data-track="21">1 - 已建立连接,可正常通信</li>
<li data-track="22">2 - 连接正在进行关闭</li>
<li data-track="23">3 - 连接已经关闭或断开,无法通信</li>
</ul>
<p data-track="25">bufferedAmount:已被放入等待传输队列,但是还没有发出的 UTF-8 文本字节数,也是只读属性。</p>
<p data-track="9">2.3、对象事件</p>
<p data-track="26">onopen - 连接时触发,用于指定连接成功后的回调函数。</p>
<p data-track="27">使用语法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法一 :只可以指定一个回调函数</span>
ws.onopen = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){

}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">方法二 :可以指定多个回调函数</span>
ws.addEventListener('open',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){

})</span></pre>
</div>
<p>&nbsp;</p>
<p data-track="16">onclose - 关闭时触发,指定连接关闭时回调函数。</p>
<p data-track="31">使用语法:与 onopen 完全一致。</p>
<p data-track="32">onmessage - 客户端接收服务端数据时触发,指定回调函数。</p>
<p data-track="33">使用语法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法一:</span>
ws.inmessage = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(event){
    let data </span>=<span style="color: rgba(0, 0, 0, 1)"> event.data
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">服务器传给客户端的数据</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法二:</span>
ws.addEventListener('inmessage', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(event){
    let data </span>=<span style="color: rgba(0, 0, 0, 1)"> event.data
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">服务器传给客户端的数据</span>
})</pre>
</div>
<p>&nbsp;</p>
<p data-track="30">onerror - 通信发生错误时触发,并指定回调函数。</p>
<p data-track="36">使用语法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">方法一</span>
ws.onerror = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误处理</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">方法二</span>
ws.addEventListener('error',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">错误处理</span>
})</pre>
</div>
<p>&nbsp;</p>
<p data-track="35">2.3、对象事件</p>
<p data-track="37">send - 用于向服务器发送数据。</p>
<p data-track="38">使用语法:</p>
<pre class="syl-page-code hljs css"><code><span class="hljs-selector-tag">ws<span class="hljs-selector-class">.send( <span class="hljs-selector-tag">data )</span></span></span></code></pre>
<p data-track="40">data :是发给服务器的数据,这个数据可以是字符串、数组、json、Blob 对象或 ArrayBuffer 对象等。</p>
<p data-track="43">如发送 Blob 对象例子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> file = document.querySelector('input='file'').files
ws.send(file)</span></pre>
</div>
<p data-track="41">close - 关闭连接</p>
<p data-track="49">使用语法:</p>
<pre class="syl-page-code hljs css"><code><span class="hljs-selector-tag">ws<span class="hljs-selector-class">.close()</span></span></code></pre><br><br>
来源:https://www.cnblogs.com/web-learn/p/15148141.html
頁: [1]
查看完整版本: HTML5(十一)——WebSocket 基础教程