杨一鲲 發表於 2019-7-1 09:39:00

Html5 + Websocket 实现的Web聊天(可群聊)

<h2 class="MsoTitle">扯淡的前情提要(赶时间的小伙伴直接<span lang="EN-US">ctrl+f</span>“正文”,开始阅读)</h2>
<p class="MsoNormal">最近公司业务需要上一个在线聊天的功能,老板说“这个应该不难吧,用户那边需求挺大,我们<span lang="EN-US">15</span>号(一周后)给它上线吧”,我。。。心理虽然慌的一批,但是老板第一次直接给工作,要留个好印象呐,得当个有情商的码农是吧。结果情商拉满的瞬间,智商就没了,一个“好”字回复的轻松,可是该咋整呢,我是一脸懵逼</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span><img src="https://uploader.shimo.im/f/NCLjmGH9nQ4UiwcF.png!thumbnail"></p>
<h2>事态发展</h2>
<p class="MsoNormal">倒叙下,说下结果,最后功能按期上线,且没有出任何<span lang="EN-US">bug</span>,普天同庆,还获得老板表扬。在此得特别感谢一个第三方服务产品——<span lang="EN-US">GoEasy</span>,简直是特效药,用它的当晚我就感觉自己吹出去的牛逼有救了。</p>
<p class="MsoNormal">咳咳,言归正传,给大家说下我解决这个问题的思路。</p>
<h3>大量关键词搜索</h3>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0"><span lang="EN-US">IM</span>,是我第一个想到的词,后来一看各大厂的方案解决方案都很齐全,但是一看文档我就懵逼了,<span lang="EN-US">api</span>过于丰富,完全就是做社交的方案,打包出来的<span lang="EN-US">sdk</span>也贼大,东西一大做起来一是坑多,二是体积太大加载慢,用户体验不好又得反过来想办法优化,所以抛弃之。</p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0"><span lang="EN-US">Websocket</span>,这是在看一些关于聊天和消息推送的博文中,都出现的词,我顺藤摸瓜,果然这是大多数<span lang="EN-US">IM</span>的底层实现,底层意味着很轻,实现应该也不复杂。事实证明,我猜对了一半,轻确实轻,大量文章关于如何定制成我想要的功能,思路很清晰,但是我碰到了另一个问题,就是性能和优化的问题。因为多数文章虽然都实现了部分功能,但是貌似离可稳定上<span lang="EN-US">Live</span>环境需求的都差之甚远。我们虽然公司小,但是在线用户高峰期还是有<span lang="EN-US">400</span>多个,而且我们对消息时效性要求比较高,并发<span lang="EN-US">+</span>时效,我擦这优化估计我研究<span lang="EN-US">1</span>个月都不知道能不能出山。&nbsp;</p>
<p class="ql-long-14519854" style="line-height: 1.7; margin-bottom: 0; margin-top: 0; font-size: 11pt; color: rgba(73, 73, 73, 1)"><span class="ql-author-14519854"> <img src="https://uploader.shimo.im/f/P2I05WuNFR4OGc2r.png!thumbnail"></span></p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0"><span lang="EN-US">Java Websocket</span>,随后我开始直接聚焦自己编程语言下的具体实现了,大<span lang="EN-US">java</span>人才济济,一定会有大佬拯救我的。可我是越看越慌,有的<span lang="EN-US">demo</span>我一跑还行,可一测。。。问题百出。迫不得已,我开始看第三方服务产品了,翻了一下,把大厂的广告都忽略了,这时候就瞧到<span lang="EN-US">GoEasy</span>了,很朴素的自我介绍“更简单的<span lang="EN-US">Websocket</span>”,我靠,找的就是你啊。</p>
<h3>一小时搞定<span lang="EN-US">Demo</span>(正文开始)</h3>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0">一上来我大先概瞅了一眼首页,内容和排版都算是简约风格。时间不等人,我马上点“快速入门”开始整。官方说<span lang="EN-US">9</span>分钟可以搞定,我<span lang="EN-US">7</span>分钟跑通。</p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0"><img src="https://uploader.shimo.im/f/WCE0dzVQaI4LlQpl.png!thumbnail"></p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0"><span style="text-indent: 0">还真是</span><span style="text-indent: 0" lang="EN-US">tmd</span><span style="text-indent: 0">简单啊,我激动的准备跟前端说一起搞个小</span><span style="text-indent: 0" lang="EN-US">demo</span><span style="text-indent: 0">测试下,结果环顾四周,就我一个傻逼</span><span style="text-indent: 0" lang="EN-US">10</span><span style="text-indent: 0">点还在办公室。好吧,写点小</span><span style="text-indent: 0" lang="EN-US">html</span><span style="text-indent: 0">自己搞一手嘛。一阵百度过后,嘿嘿,虽然</span><span style="text-indent: 0" lang="EN-US">UI</span><span style="text-indent: 0">丑陋,</span><span style="text-indent: 0" lang="EN-US">js</span><span style="text-indent: 0">也不规范,但“实现多人在线群聊的功能已经实现了!”,下面给大家看下截图和代码,代码是纯</span><span style="text-indent: 0" lang="EN-US">html</span><span style="text-indent: 0">,“</span><span style="text-indent: 0" lang="EN-US">50</span><span style="text-indent: 0">行纯</span><span style="text-indent: 0" lang="EN-US">html</span><span style="text-indent: 0">实现的哦”,光这一点,你就知道这个</span><span style="text-indent: 0" lang="EN-US">GoEasy</span><span style="text-indent: 0">把</span><span style="text-indent: 0" lang="EN-US">websocket</span><span style="text-indent: 0">封装的有多好了。</span></p>
<p class="ql-long-14519854" style="line-height: 1.7; margin-bottom: 0; margin-top: 0; font-size: 11pt; color: rgba(73, 73, 73, 1)"><span class="ql-author-14519854"> <img src="https://uploader.shimo.im/f/lZal0pSN5MItbWm7.gif"></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;GoEasy Test&lt;/title&gt;
&lt;script type="text/javascript" src="https://cdn-hangzhou.goeasy.io/goeasy.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
        var textarea_value = document.getElementById("textarea");
    if(typeof GoEasy !== 'undefined'){
      var goEasy = new GoEasy({
            appkey: '**********'               
      });
    }   

    //页面一加载就订阅
   goEasy.subscribe({
      channel: 'demo_channel',
      onMessage: function(message){
                        if(!textarea_value) {
                                textarea_value = "";
                        }
                        textarea_value = textarea_value + message.content + "\n";
            //console.log('Meessage received:'+message.content);
                        //alert('收到:'+message.content);
                        document.getElementById("textarea").value = textarea_value;
                       
      }
    });

//推送消息
    function publishMessage(){
      goEasy.publish({
            channel: 'demo_channel',
            message: document.getElementById("message").value
      });
    }         

   //取消订阅的页面不会再收到信息
    function unsubscribe(){
            goEasy.unsubscribe({
                channel:"demo_channel"
            });
    }      
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;textarea id="textarea" rows="20" cols ="50"&gt;
        &lt;/textarea&gt;
        &lt;br/&gt;
        &lt;input type="text" id="message" /&gt;
    &lt;input type="button" value="推送消息" onclick="publishMessage()"/&gt;
    &lt;input type="button" value="取消订阅" onclick="unsubscribe()"/&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<h2>事后总结</h2>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0">互联网发展到现在已经是相当成熟了,造轮子真是非常吃力不讨好的事了,至少对于我这些种初级的码农来说。平时都是写业务,但为了更好的解决问题,学会使用第三方服务,也是一种新的必要能力了,能解决问题才有核心竞争力,对前辈们做出的产品深度体验后,通过<span lang="EN-US">api</span>也会了解他们的<span lang="EN-US">coding</span>设计理念,<span lang="EN-US">api</span>的精妙设置背后肯定是他们架构经验的体现。</p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0">最后帮<span lang="EN-US">GoEasy</span>打个广告,除了产品好用,他们现在的技术支持也超级给力,那天晚上<span lang="EN-US">11</span>点还给说了实现功能的思路,瞬间把我点透。</p>
<p class="MsoListParagraph" style="text-indent: 0; mso-char-indent-count: 0">来咯,GoEasy更简单的<span lang="EN-US">WebSocket</span>,让我们专注<span lang="EN-US">coding</span>,<span lang="EN-US">WebSocket</span>就交给他们解决吧。加油!</p>
<p></audio></p><br><br>
来源:https://www.cnblogs.com/maolan/p/11112343.html
頁: [1]
查看完整版本: Html5 + Websocket 实现的Web聊天(可群聊)