欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

轮询、长轮询和网络套接字的前端实施

最编程 2024-04-26 11:56:05
...
【直播预告】大模型会取代程序员吗?”

<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown"><h2 id="web-socket">Web Socket</h2> <p>应用场景:实现即时通讯:如股票交易行情分析、聊天室、在线游戏等,替代轮询和长轮询</p> <h3 id="轮询">轮询</h3> <blockquote> <p>轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。</p> </blockquote> <div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript hljs"><span class="kw"><span class="hljs-keyword">var</span></span> xhr <span class="op">=</span> <span class="kw"><span class="hljs-keyword">new</span></span> <span class="at">XMLHttpRequest</span>()<span class="op">;</span> <span class="at">setInterval</span>(<span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span> <span class="va">xhr</span>.<span class="at">open</span>(<span class="st"><span class="hljs-string">'GET'</span></span><span class="op">,</span><span class="st"><span class="hljs-string">'/user'</span></span>)<span class="op">;</span> <span class="va">xhr</span>.<span class="at">onreadystatechange</span> <span class="op">=</span> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span>

    <span class="op">};</span>
    <span class="va">xhr</span>.<span class="at">send</span>()<span class="op">;</span>
<span class="op">},</span><span class="dv"><span class="hljs-number">1000</span></span>)</code></pre></div>

<h3 id="长轮询">长轮询:</h3> <p>ajax实现:在发送ajax后,服务器端会阻塞请求直到有数据传递或超时才返回。 客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。</p> <div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript hljs"> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function"> </span><span class="at"><span class="hljs-function"><span class="hljs-title">ajax</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span> <span class="kw"><span class="hljs-keyword">var</span></span> xhr <span class="op">=</span> <span class="kw"><span class="hljs-keyword">new</span></span> <span class="at">XMLHttpRequest</span>()<span class="op">;</span> <span class="va">xhr</span>.<span class="at">open</span>(<span class="st"><span class="hljs-string">'GET'</span></span><span class="op">,</span><span class="st"><span class="hljs-string">'/user'</span></span>)<span class="op">;</span> <span class="va">xhr</span>.<span class="at">onreadystatechange</span> <span class="op">=</span> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span> <span class="at">ajax</span>()<span class="op">;</span> <span class="op">};</span> <span class="va">xhr</span>.<span class="at">send</span>()<span class="op">;</span> <span class="op">}</span></code></pre></div> <h3 id="web-socket-1">Web Socket:</h3> <pre><code class="hljs cpp">轮询与长轮询都是基于HTTP的,两者本身存在着缺陷:轮询需要更快的处理速度;长轮询则更要求处理并发的能力;两者都是“被动型服务器”的体现:服务器不会主动推送信息,而是在客户端发送ajax请求后进行返回的响应。而理想的模型是<span class="hljs-string">"在服务器端数据有了变化后,可以主动推送给客户端"</span>,这种<span class="hljs-string">"主动型"</span>服务器是解决这类问题的很好的方案。Web Sockets就是这样的方案。</code></pre> <div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript hljs"><span class="co"><span class="hljs-comment">//需要先npm install ws</span></span>

<span class="co"><span class="hljs-comment">//服务器端</span></span> <span class="kw"><span class="hljs-keyword">var</span></span> Server <span class="op">=</span> <span class="at"><span class="hljs-built_in">require</span></span>(<span class="st"><span class="hljs-string">'ws'</span></span>).<span class="at">Server</span><span class="op">;</span> <span class="kw"><span class="hljs-keyword">var</span></span> wss <span class="op">=</span> <span class="kw"><span class="hljs-keyword">new</span></span> <span class="at">Server</span>(<span class="op">{</span> <span class="dt">port</span><span class="op">:</span><span class="dv"><span class="hljs-number">2000</span></span> <span class="op">}</span>)<span class="op">;</span> <span class="va">wss</span>.<span class="at">on</span>(<span class="st"><span class="hljs-string">'connection'</span></span><span class="op">,</span><span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params">ws</span>)</span><span class="op">{</span> <span class="va">ws</span>.<span class="at">on</span>(<span class="st"><span class="hljs-string">'message'</span></span><span class="op">,</span><span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params">data</span>)</span><span class="op">{</span> <span class="va">ws</span>.<span class="at">send</span>(<span class="st"><span class="hljs-string">'你好,客户端,我是服务器!'</span></span>)<span class="op">;</span> <span class="va"><span class="hljs-built_in">console</span></span>.<span class="at">log</span>(data)<span class="op">;</span> <span class="op">}</span>) <span class="op">}</span>)<span class="op">;</span>

<span class="co"><span class="hljs-comment">//node客户端</span></span>

<span class="kw"><span class="hljs-keyword">var</span></span> WebSocket <span class="op">=</span> <span class="at"><span class="hljs-built_in">require</span></span>(<span class="st"><span class="hljs-string">'ws'</span></span>)<span class="op">;</span> <span class="kw"><span class="hljs-keyword">var</span></span> socket <span class="op">=</span> <span class="kw"><span class="hljs-keyword">new</span></span> <span class="at">WebSocket</span>(<span class="st"><span class="hljs-string">'ws://localhost:2000/'</span></span>)<span class="op">;</span> <span class="va">socket</span>.<span class="at">on</span>(<span class="st"><span class="hljs-string">'open'</span></span><span class="op">,</span><span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span> <span class="va">socket</span>.<span class="at">send</span>(<span class="st"><span class="hljs-string">'你好,服务器,我是客户端'</span></span>)<span class="op">;</span> <span class="op">}</span>)<span class="op">;</span> <span class="va">socket</span>.<span class="at">on</span>(<span class="st"><span class="hljs-string">'message'</span></span><span class="op">,</span><span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params">event</span>)</span><span class="op">{</span> <span class="va"><span class="hljs-built_in">console</span></span>.<span class="at">log</span>(event)<span class="op">;</span> <span class="op">}</span>)

<span class="co"><span class="hljs-comment">//html客户端(注:浏览器客户端与node客户端只需要一种)</span></span>

<span class="op"><</span>script<span class="op">></span> <span class="kw"><span class="hljs-keyword">var</span></span> socket <span class="op">=</span> <span class="kw"><span class="hljs-keyword">new</span></span> <span class="at">WebSocket</span>(<span class="st"><span class="hljs-string">'ws://localhost:2000/'</span></span>)<span class="op">;</span> <span class="va">socket</span>.<span class="at">onopen</span> <span class="op">=</span> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span><span class="op">{</span>

<span class="op">};</span>
<span class="va">socket</span>.<span class="at">onmessage</span> <span class="op">=</span> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span class="hljs-function">(<span class="hljs-params">event</span>)</span><span class="op">{</span>
    <span class="va"><span class="hljs-built_in">console</span></span>.<span class="at">log</span>(<span class="va">event</span>.<span class="at">data</span>)
<span class="op">}</span>

<span class="op"><</span><span class="ss"><span class="hljs-regexp">/script></span></span><span class="hljs-regexp"> </span></code></pre></div>

</div>