<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    本文由愛奇藝技術(shù)團(tuán)隊(duì)原創(chuàng)分享,原題《構(gòu)建通用WebSocket推送網(wǎng)關(guān)的設(shè)計(jì)與實(shí)踐》,有優(yōu)化和改動(dòng)。

    1、引言

    叢所周之,HTTP協(xié)議是一種無狀態(tài)、基于TCP的請(qǐng)求/響應(yīng)模式的協(xié)議,即請(qǐng)求只能由客戶端發(fā)起、由服務(wù)端進(jìn)行響應(yīng)。在大多數(shù)場(chǎng)景,這種請(qǐng)求/響應(yīng)的Pull模式可以滿足需求。但在某些情形:例如消息推送(IM中最為常見,比如IM的離線消息推送)、實(shí)時(shí)通知等應(yīng)用場(chǎng)景,需要實(shí)時(shí)將數(shù)據(jù)同步到客戶端,這就要求服務(wù)端支持主動(dòng)Push數(shù)據(jù)的能力。

    傳統(tǒng)的Web服務(wù)端推送技術(shù)歷史悠久,經(jīng)歷了短輪詢、長輪詢等階段的發(fā)展(見《新手入門貼:史上最全Web端即時(shí)通訊技術(shù)原理詳解),一定程度上能夠解決問題,但也存在著不足,例如時(shí)效性、資源浪費(fèi)等。HTML5標(biāo)準(zhǔn)帶來的WebSocket規(guī)范基本結(jié)束了這一局面,成為目前服務(wù)端消息推送技術(shù)的主流方案。

    在系統(tǒng)中集成WebSocket十分簡單,相關(guān)討論與資料很豐富。但如何實(shí)現(xiàn)一個(gè)通用的WebSocket推送網(wǎng)關(guān)尚未有成熟的方案。目前的云服務(wù)廠商主要關(guān)注iOS和安卓等移動(dòng)端推送,也缺少對(duì)WebSocket的支持。本文分享了愛奇藝基于Netty實(shí)現(xiàn)WebSocket長連接實(shí)時(shí)推送網(wǎng)關(guān)時(shí)的實(shí)踐經(jīng)驗(yàn)總結(jié)。

    學(xué)習(xí)交流:

    - 即時(shí)通訊/推送技術(shù)開發(fā)交流5群:215477170 [推薦]

    - 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM

    - 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK

    本文同步發(fā)布于:http://www.52im.net/thread-3539-1-1.html

    2、專題目錄

    本文是系列文章的第4篇,總目錄如下:

    長連接網(wǎng)關(guān)技術(shù)專題(一):京東京麥的生產(chǎn)級(jí)TCP網(wǎng)關(guān)技術(shù)實(shí)踐總結(jié)

    長連接網(wǎng)關(guān)技術(shù)專題(二):知乎千萬級(jí)并發(fā)的高性能長連接網(wǎng)關(guān)技術(shù)實(shí)踐

    長連接網(wǎng)關(guān)技術(shù)專題(三):手淘億級(jí)移動(dòng)端接入層網(wǎng)關(guān)的技術(shù)演進(jìn)之路

    長連接網(wǎng)關(guān)技術(shù)專題(四):愛奇藝WebSocket實(shí)時(shí)推送網(wǎng)關(guān)技術(shù)實(shí)踐》(* 本文

    其它相關(guān)技術(shù)文章:

    絕對(duì)干貨:基于Netty實(shí)現(xiàn)海量接入的推送服務(wù)技術(shù)要點(diǎn)

    京東到家基于Netty的WebSocket應(yīng)用實(shí)踐分享

    愛奇藝技術(shù)團(tuán)隊(duì)分享的其它文章:

    愛奇藝技術(shù)分享:輕松詼諧,講解視頻編解碼技術(shù)的過去、現(xiàn)在和將來

    愛奇藝技術(shù)分享:愛奇藝Android客戶端啟動(dòng)速度優(yōu)化實(shí)踐總結(jié)

    愛奇藝移動(dòng)端網(wǎng)絡(luò)優(yōu)化實(shí)踐分享:網(wǎng)絡(luò)請(qǐng)求成功率優(yōu)化篇

    3、舊方案存在的技術(shù)痛點(diǎn)

    愛奇藝號(hào)是我們內(nèi)容生態(tài)的重要組成,作為前臺(tái)系統(tǒng),對(duì)用戶體驗(yàn)有較高要求,直接影響著創(chuàng)作者的創(chuàng)作熱情。

    目前,愛奇藝號(hào)多個(gè)業(yè)務(wù)場(chǎng)景中用到了WebSocket實(shí)時(shí)推送技術(shù),包括:

    • 1)用戶評(píng)論:實(shí)時(shí)的將評(píng)論消息推送到瀏覽器;
    • 2)實(shí)名認(rèn)證:合同簽署前需要對(duì)用戶進(jìn)行實(shí)名認(rèn)證,用戶掃描二維碼后進(jìn)入第三方的認(rèn)證頁面,認(rèn)證完成后異步通知瀏覽器認(rèn)證的狀態(tài);
    • 3)活體識(shí)別:類似實(shí)名認(rèn)證,當(dāng)活體識(shí)別完成后,異步將結(jié)果通知瀏覽器。

    在實(shí)際的業(yè)務(wù)開發(fā)中,我們發(fā)現(xiàn),WebSocket實(shí)時(shí)推送技術(shù)在使用中存在一些問題。

    這些問題是:

    • 1)首先:WebSocket技術(shù)棧不統(tǒng)一,既有基于Netty實(shí)現(xiàn)的,也有基于Web容器實(shí)現(xiàn)的,給開發(fā)和維護(hù)帶來困難;
    • 2)其次:WebSocket實(shí)現(xiàn)分散在在各個(gè)工程中,與業(yè)務(wù)系統(tǒng)強(qiáng)耦合,如果有其他業(yè)務(wù)需要集成WebSocket,面臨著重復(fù)開發(fā)的窘境,浪費(fèi)成本、效率低下;
    • 3)第三:WebSocket是有狀態(tài)協(xié)議的,客戶端連接服務(wù)器時(shí)只和集群中一個(gè)節(jié)點(diǎn)連接,數(shù)據(jù)傳輸過程中也只與這一節(jié)點(diǎn)通信。WebSocket集群需要解決會(huì)話共享的問題。如果只采用單節(jié)點(diǎn)部署,雖然可以避免這一問題,但無法水平擴(kuò)展支撐更高負(fù)載,有單點(diǎn)的風(fēng)險(xiǎn);
    • 4)最后:缺乏監(jiān)控與報(bào)警,雖然可以通過Linux的Socket連接數(shù)大致評(píng)估WebSocket長連接數(shù),但數(shù)字并不準(zhǔn)確,也無法得知用戶數(shù)等具有業(yè)務(wù)含義的指標(biāo)數(shù)據(jù);無法與現(xiàn)有的微服務(wù)監(jiān)控整合,實(shí)現(xiàn)統(tǒng)一監(jiān)控和報(bào)警。

    PS:限于篇幅本文不詳細(xì)介紹WebSocket技術(shù)本身,有興趣可以詳讀《WebSocket從入門到精通,半小時(shí)就夠!》。

    4、新方案的技術(shù)目標(biāo)

    如上節(jié)所示,為了解決舊方案中存在的問題,我們需要實(shí)現(xiàn)統(tǒng)一的WebSocket長連接實(shí)時(shí)推送網(wǎng)關(guān)。

    這套新的網(wǎng)關(guān)需要具備如下特點(diǎn):

    • 1)集中實(shí)現(xiàn)長連接管理和推送能力:統(tǒng)一技術(shù)棧,將長連接作為基礎(chǔ)能力沉淀,便于功能迭代和升級(jí)維護(hù);
    • 2)與業(yè)務(wù)解耦:將業(yè)務(wù)邏輯與長連接通信分離,使業(yè)務(wù)系統(tǒng)不再關(guān)心通信細(xì)節(jié),也避免了重復(fù)開發(fā),浪費(fèi)研發(fā)成本;
    • 3)使用簡單:提供HTTP推送通道,方便各種開發(fā)語言的接入。業(yè)務(wù)系統(tǒng)只需要簡單的調(diào)用,就可以實(shí)現(xiàn)數(shù)據(jù)推送,提升研發(fā)效率;
    • 4)分布式架構(gòu):實(shí)現(xiàn)多節(jié)點(diǎn)的集群,支持水平擴(kuò)展應(yīng)對(duì)業(yè)務(wù)增長帶來的挑戰(zhàn);節(jié)點(diǎn)宕機(jī)不影響服務(wù)整體可用性,保證高可靠;
    • 5)多端消息同步:允許用戶使用多個(gè)瀏覽器或標(biāo)簽頁同時(shí)登陸在線,保證消息同步發(fā)送;
    • 6)多維度監(jiān)控與報(bào)警:自定義監(jiān)控指標(biāo)與現(xiàn)有微服務(wù)監(jiān)控系統(tǒng)打通,出現(xiàn)問題時(shí)可及時(shí)報(bào)警,保證服務(wù)的穩(wěn)定性。

    5、新方案的技術(shù)選型

    在眾多的WebSocket實(shí)現(xiàn)中,從性能、擴(kuò)展性、社區(qū)支持等方面考慮,最終選擇了Netty。Netty是一個(gè)高性能、事件驅(qū)動(dòng)、異步非阻塞的網(wǎng)絡(luò)通信框架,在許多知名的開源軟件中被廣泛使用。

    PS:如果你對(duì)Netty知之甚少,可以詳讀以下兩篇:

    WebSocket是有狀態(tài)的,無法像直接HTTP以集群方式實(shí)現(xiàn)負(fù)載均衡,長連接建立后即與服務(wù)端某個(gè)節(jié)點(diǎn)保持著會(huì)話,因此集群下想要得知會(huì)話屬于哪個(gè)節(jié)點(diǎn)有點(diǎn)困難。

    解決以上問題一般有兩種技術(shù)方案:

    • 1)一種是使用類似微服務(wù)的注冊(cè)中心來維護(hù)全局的會(huì)話映射關(guān)系;
    • 2)一種是使用事件廣播由各節(jié)點(diǎn)自行判斷是否持有會(huì)話,兩種方案對(duì)比如下表所示。

    WebSocket集群方案:

    綜合考慮實(shí)現(xiàn)成本與集群規(guī)模,選擇了輕量級(jí)的事件廣播方案。

    實(shí)現(xiàn)廣播可以選擇基于RocketMQ的消息廣播、基于Redis的Publish/Subscribe、基于ZooKeeper的通知等方案,其優(yōu)缺點(diǎn)對(duì)比如下表所示。從吞吐量、實(shí)時(shí)性、持久化、實(shí)現(xiàn)難易等方面考慮,最終選擇了RocketMQ。

    廣播的實(shí)現(xiàn)方案對(duì)比:

    6、新方案的實(shí)現(xiàn)思路

    6.1 系統(tǒng)架構(gòu)

    網(wǎng)關(guān)的整體架構(gòu)如下圖所示:

    網(wǎng)關(guān)的整體流程如下:

    1)客戶端與網(wǎng)關(guān)任一節(jié)點(diǎn)握手建立起長連接,節(jié)點(diǎn)將其加入到內(nèi)存維護(hù)的長連接隊(duì)列。客戶端定時(shí)向服務(wù)端發(fā)送心跳消息,如果超過設(shè)定的時(shí)間仍沒有收到心跳,則認(rèn)為客戶端與服務(wù)端的長連接已斷開,服務(wù)端會(huì)關(guān)閉連接,清理內(nèi)存中的會(huì)話。

    2)當(dāng)業(yè)務(wù)系統(tǒng)需要向客戶端推送數(shù)據(jù)時(shí),通過網(wǎng)關(guān)提供的HTTP接口將數(shù)據(jù)發(fā)向網(wǎng)關(guān)。

    3)網(wǎng)關(guān)在接收到推送請(qǐng)求后,將消息寫入RocketMQ。

    4)網(wǎng)關(guān)作為消費(fèi)者,以廣播模式消費(fèi)消息,所有節(jié)點(diǎn)都會(huì)接收到消息。

    5)節(jié)點(diǎn)接收到消息后判斷推送的消息目標(biāo)是否在自己內(nèi)存中維護(hù)的長連接隊(duì)列里,如果存在則通過長連接推送數(shù)據(jù),否則直接忽略。

    網(wǎng)關(guān)以多節(jié)點(diǎn)方式構(gòu)成集群,每節(jié)點(diǎn)負(fù)責(zé)一部分長連接,可實(shí)現(xiàn)負(fù)載均衡,當(dāng)面對(duì)海量連接時(shí),也可以通過增加節(jié)點(diǎn)的方式分擔(dān)壓力,實(shí)現(xiàn)水平擴(kuò)展。

    同時(shí),當(dāng)節(jié)點(diǎn)出現(xiàn)宕機(jī)時(shí),客戶端會(huì)嘗試重新與其他節(jié)點(diǎn)握手建立長連接,保證服務(wù)整體的可用性。

    6.2 會(huì)話管理

    WebSocket長連接建立起來后,會(huì)話維護(hù)在各節(jié)點(diǎn)的內(nèi)存中。SessionManager組件負(fù)責(zé)管理會(huì)話,內(nèi)部使用了哈希表維護(hù)了UID與UserSession的關(guān)系。

    UserSession代表用戶維度的會(huì)話,一個(gè)用戶可能會(huì)同時(shí)建立多個(gè)長連接,因此UserSession內(nèi)部同樣使用了一個(gè)哈希表維護(hù)Channel與ChannelSession的關(guān)系。

    為了避免用戶無限制的創(chuàng)建長連接,UserSession在內(nèi)部的ChannelSession超過一定數(shù)量后,會(huì)將最早建立的ChannelSession關(guān)閉,減少服務(wù)器資源占用。SessionManager、UserSession、ChannelSession的關(guān)系如下圖所示。

    SessionManager組件:

    6.3 監(jiān)控與報(bào)警

    為了了解集群建立了多少長連接、包含了多少用戶,網(wǎng)關(guān)提供了基本的監(jiān)控與報(bào)警能力。

    網(wǎng)關(guān)接入了Micrometer,將連接數(shù)與用戶數(shù)作為自定義指標(biāo)暴露,供Prometheus進(jìn)行采集,實(shí)現(xiàn)了與現(xiàn)有的微服務(wù)監(jiān)控系統(tǒng)打通。

    Grafana中方便地查看連接數(shù)、用戶數(shù)、JVM、CPU、內(nèi)存等指標(biāo)數(shù)據(jù),了解網(wǎng)關(guān)當(dāng)前的服務(wù)能力與壓力。報(bào)警規(guī)則也可以在Grafana中配置,當(dāng)數(shù)據(jù)異常時(shí)觸發(fā)奇信(內(nèi)部報(bào)警平臺(tái))報(bào)警。

    7、新方案的性能壓測(cè)

    壓測(cè)準(zhǔn)備:

    • 1)壓測(cè)選擇兩臺(tái)配置為4核16G的虛擬機(jī),分別作為服務(wù)器和客戶端;
    • 2)壓測(cè)時(shí)選擇為網(wǎng)關(guān)開放了20個(gè)端口,同時(shí)建立20個(gè)客戶端;
    • 3)每個(gè)客戶端使用一個(gè)服務(wù)端端口建立起5萬連接,可以同時(shí)創(chuàng)建百萬個(gè)連接。

    連接數(shù)(百萬級(jí))與內(nèi)存使用情況如下圖所示:

    給百萬個(gè)長連接同時(shí)發(fā)送一條消息,采用單線程發(fā)送,服務(wù)器發(fā)送完成的平均耗時(shí)在10s左右,如下圖所示。

    服務(wù)器推送耗時(shí): 

    一般同一用戶同時(shí)建立的長連接都在個(gè)位數(shù)。以10個(gè)長連接為例,在并發(fā)數(shù)600、持續(xù)時(shí)間120s條件下壓測(cè),推送接口的TPS大約在1600+,如下圖所示。

    長連接10、并發(fā)600、持續(xù)時(shí)間120s的壓測(cè)數(shù)據(jù):

    當(dāng)前的性能指標(biāo)已滿足我們的實(shí)際業(yè)務(wù)場(chǎng)景,可支持未來的業(yè)務(wù)增長。

    8、新方案的實(shí)際應(yīng)用案例

    為了更生動(dòng)的說明優(yōu)化效果,文章最后,我們也以封面圖添加濾鏡效果為例,介紹一個(gè)愛奇藝號(hào)使用新WebSocket網(wǎng)關(guān)方案的案例。

    愛奇藝號(hào)自媒體發(fā)表視頻時(shí),可選擇為封面圖添加濾鏡效果,引導(dǎo)用戶提供提供更優(yōu)質(zhì)的封面。

    當(dāng)用戶選擇一個(gè)封面圖后,會(huì)提交異步的后臺(tái)處理任務(wù)。當(dāng)異步任務(wù)處理完成后,通過WebSocket將不同濾鏡效果處理后的圖片返回給瀏覽器,業(yè)務(wù)場(chǎng)景如下圖所示。

    從研發(fā)效率方面考慮,如果在業(yè)務(wù)系統(tǒng)中集成WebSocket,至少需要1-2天的開發(fā)時(shí)間。

    如果直接使用新的WebSocket網(wǎng)關(guān)的推送能力,只需要簡單的接口調(diào)用就實(shí)現(xiàn)了數(shù)據(jù)推送,開發(fā)時(shí)間降低到分鐘級(jí)別,研發(fā)效率大大提高。

    從運(yùn)維成本方面考慮,業(yè)務(wù)系統(tǒng)不再含有與業(yè)務(wù)邏輯無關(guān)的通信細(xì)節(jié),代碼的可維護(hù)性更強(qiáng),系統(tǒng)架構(gòu)變得更加簡單,運(yùn)維成本大大降低。

    9、寫在最后

    WebSocket是目前實(shí)現(xiàn)服務(wù)端推送的主流技術(shù),恰當(dāng)使用能夠有效提供系統(tǒng)響應(yīng)能力,提升用戶體驗(yàn)。通過WebSocket長連接網(wǎng)關(guān)可以快速為系統(tǒng)增加數(shù)據(jù)推送能力,有效減少運(yùn)維成本,提高開發(fā)效率。

    長連接網(wǎng)關(guān)的價(jià)值在于:

    • 1)它封裝了WebSocket通信細(xì)節(jié),與業(yè)務(wù)系統(tǒng)解耦,使得長連接網(wǎng)關(guān)與業(yè)務(wù)系統(tǒng)可獨(dú)立優(yōu)化迭代,避免重復(fù)開發(fā),便于開發(fā)與維護(hù);
    • 2)網(wǎng)關(guān)提供了簡單易用的HTTP推送通道,支持多種開發(fā)語言接入,便于系統(tǒng)集成和使用;
    • 3)網(wǎng)關(guān)采用了分布式架構(gòu),可以實(shí)現(xiàn)服務(wù)的水平擴(kuò)容、負(fù)載均衡與高可用;
    • 4)網(wǎng)關(guān)集成了監(jiān)控與報(bào)警,當(dāng)系統(tǒng)異常時(shí)能及時(shí)預(yù)警,保證服務(wù)的健康和穩(wěn)定。

    目前,新的WebSocket長連接實(shí)時(shí)網(wǎng)關(guān)已在愛奇藝號(hào)圖片濾鏡結(jié)果通知、MCN電子簽章等多個(gè)業(yè)務(wù)場(chǎng)景中得到應(yīng)用。

    未來還有許多方面需要探索,例如消息的重發(fā)與ACK、WebSocket二進(jìn)制數(shù)據(jù)的支持、多租戶的支持等。

    附錄:更多相關(guān)技術(shù)資料

    [1] 有關(guān)WEB端即時(shí)通訊開發(fā):

    新手入門貼:史上最全Web端即時(shí)通訊技術(shù)原理詳解

    Web端即時(shí)通訊技術(shù)盤點(diǎn):短輪詢、Comet、Websocket、SSE

    SSE技術(shù)詳解:一種全新的HTML5服務(wù)器推送事件技術(shù)

    Comet技術(shù)詳解:基于HTTP長連接的Web端實(shí)時(shí)通信技術(shù)

    新手快速入門:WebSocket簡明教程

    WebSocket詳解(一):初步認(rèn)識(shí)WebSocket技術(shù)

    WebSocket詳解(二):技術(shù)原理、代碼演示和應(yīng)用案例

    WebSocket詳解(三):深入WebSocket通信協(xié)議細(xì)節(jié)

    WebSocket詳解(四):刨根問底HTTP與WebSocket的關(guān)系(上篇)

    WebSocket詳解(五):刨根問底HTTP與WebSocket的關(guān)系(下篇)

    WebSocket詳解(六):刨根問底WebSocket與Socket的關(guān)系

    socket.io實(shí)現(xiàn)消息推送的一點(diǎn)實(shí)踐及思路

    LinkedIn的Web端即時(shí)通訊實(shí)踐:實(shí)現(xiàn)單機(jī)幾十萬條長連接

    Web端即時(shí)通訊技術(shù)的發(fā)展與WebSocket、Socket.io的技術(shù)實(shí)踐

    Web端即時(shí)通訊安全:跨站點(diǎn)WebSocket劫持漏洞詳解(含示例代碼)

    開源框架Pomelo實(shí)踐:搭建Web端高性能分布式IM聊天服務(wù)器

    使用WebSocket和SSE技術(shù)實(shí)現(xiàn)Web端消息推送

    詳解Web端通信方式的演進(jìn):從Ajax、JSONP 到 SSE、Websocket

    MobileIMSDK-Web的網(wǎng)絡(luò)層框架為何使用的是Socket.io而不是Netty?

    理論聯(lián)系實(shí)際:從零理解WebSocket的通信原理、協(xié)議格式、安全性

    微信小程序中如何使用WebSocket實(shí)現(xiàn)長連接(含完整源碼)

    八問WebSocket協(xié)議:為你快速解答WebSocket熱門疑問

    Web端即時(shí)通訊實(shí)踐干貨:如何讓你的WebSocket斷網(wǎng)重連更快速?

    WebSocket從入門到精通,半小時(shí)就夠!

    WebSocket硬核入門:200行代碼,教你徒手?jǐn)]一個(gè)WebSocket服務(wù)器

    >> 更多同類文章 ……

    [2] 有關(guān)推送技術(shù)的文章:

    一個(gè)基于MQTT通信協(xié)議的完整Android推送Demo

    求教android消息推送:GCM、XMPP、MQTT三種方案的優(yōu)劣

    移動(dòng)端實(shí)時(shí)消息推送技術(shù)淺析

    絕對(duì)干貨:基于Netty實(shí)現(xiàn)海量接入的推送服務(wù)技術(shù)要點(diǎn)

    極光推送系統(tǒng)大規(guī)模高并發(fā)架構(gòu)的技術(shù)實(shí)踐分享

    魅族2500萬長連接的實(shí)時(shí)消息推送架構(gòu)的技術(shù)實(shí)踐分享

    專訪魅族架構(gòu)師:海量長連接的實(shí)時(shí)消息推送系統(tǒng)的心得體會(huì)

    基于WebSocket實(shí)現(xiàn)Hybrid移動(dòng)應(yīng)用的消息推送實(shí)踐(含代碼示例)

    一個(gè)基于長連接的安全可擴(kuò)展的訂閱/推送服務(wù)實(shí)現(xiàn)思路

    實(shí)踐分享:如何構(gòu)建一套高可用的移動(dòng)端消息推送系統(tǒng)?

    Go語言構(gòu)建千萬級(jí)在線的高并發(fā)消息推送系統(tǒng)實(shí)踐(來自360公司)

    騰訊信鴿技術(shù)分享:百億級(jí)實(shí)時(shí)消息推送的實(shí)戰(zhàn)經(jīng)驗(yàn)

    百萬在線的美拍直播彈幕系統(tǒng)的實(shí)時(shí)推送技術(shù)實(shí)踐之路

    京東京麥商家開放平臺(tái)的消息推送架構(gòu)演進(jìn)之路

    技術(shù)干貨:從零開始,教你設(shè)計(jì)一個(gè)百萬級(jí)的消息推送系統(tǒng)

    長連接網(wǎng)關(guān)技術(shù)專題(四):愛奇藝WebSocket實(shí)時(shí)推送網(wǎng)關(guān)技術(shù)實(shí)踐

    >> 更多同類文章 ……

    本文已同步發(fā)布于“即時(shí)通訊技術(shù)圈”公眾號(hào)。

    ▲ 本文在公眾號(hào)上的鏈接是:點(diǎn)此進(jìn)入。同步發(fā)布鏈接是:http://www.52im.net/thread-3539-1-1.html



    作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時(shí)通訊開發(fā)交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時(shí)是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級(jí)移動(dòng)端即時(shí)通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處(也可前往 我的52im.net 找到我)。


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 国产日产亚洲系列最新| 免费国产黄网站在线观看动图| 国产亚洲一区二区三区在线不卡| 免费在线观看的网站| 97精品免费视频| 伊人久久大香线蕉免费视频| 国产成人 亚洲欧洲| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲天堂视频在线观看| 亚洲线精品一区二区三区| 免费人成激情视频| 日韩视频免费在线| 成人影片麻豆国产影片免费观看| 97在线视频免费| 91热久久免费精品99| 在线看片免费人成视频播| 两性色午夜视频免费网| 精品无码国产污污污免费网站国产 | 岛国片在线免费观看| 国产免费女女脚奴视频网| a毛片在线还看免费网站| 亚洲免费视频一区二区三区| 黄色毛片免费在线观看| 国产综合激情在线亚洲第一页| 亚洲另类自拍丝袜第五页| 亚洲欧洲av综合色无码| 亚洲人AV在线无码影院观看| 国产午夜亚洲精品| 亚洲日韩国产一区二区三区在线| 亚洲人成在久久综合网站| 亚洲乱码一二三四区乱码| 亚洲成人激情小说| 亚洲国产成人综合精品| 国产亚洲精品美女2020久久| 猫咪www免费人成网站| 免费一级毛suv好看的国产网站| 无遮挡免费一区二区三区| 国产福利免费视频 | 女人与禽交视频免费看| 成人毛片免费观看视频在线| 日本免费v片一二三区|