默認
打賞 發表評論 88
想開發IM:買成品怕坑?租第3方怕貴?找開源自已擼?盡量別走彎路了... 找站長給點建議
NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]
閱讀(139409) | 評論(88 收藏49 淘帖4 9

1、前言


NIO框架的流行,使得開發大并發、高性能的互聯網服務端成為可能。這其中最流行的無非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3Netty4Netty5已經被取消開發了詳見此文)。

本文將演示的是一個基于Netty4的UDP服務端和一個標準UDP客戶端(Java實現)雙向通信的完整例子。實際上,Netty4的UDP例子非常難找(恕我愚鈍,找遍全網也沒有有價值的代碼,有也是Netty3,而Netty3和Netty4的風格差的不是一點點,參考意義不大),官方的代碼演示里只有一個簡單的UDP廣播例子,不足以用于演示Netty4的UDP通信最佳實踐。

重要說明:限于篇幅原因,文中所列代碼并非完整,完整代碼(Eclipse工程)請從文末 “11、完整源碼工程下載” 處下載所有代碼!

2、《NIO框架入門》系列文章


有關MINA和Netty的入門文章很多,但多數都是復制、粘貼的未經證實的來路不明內容,對于初次接觸的人來說,一個可以運行且編碼規范的Demo,顯然要比各種“詳解”、“深入分析”之類的要來的直接和有意義。本系列入門文章正是基于此種考慮而寫,雖無精深內容,但至少希望對初次接觸MINA、Netty的人有所啟發,起到拋磚引玉的作用。

本文是《NIO框架入門》系列文章中的第1篇,目錄如下:


3、本文亮點


  • Netty4的UDP例子太難找:
    Netty4的完整雙向UDP通信例子很難找(官方沒有),本文就是要用代碼來演示這個;
  • 本例中客戶端UDP實現無需第3方依賴:
    通常MINA或Netty的例子里,客戶端也都是用的MINA或Netty的客戶端lib,本文將直接使用標準UDP代碼(便于跨平臺實現,比如iOS平臺),不依賴于第3方包;
  • 完整可執行源碼、方便學習:
    完整的Demo源碼,適合新手直接運行,便于學習和研究。
  • 生產環境下的進階學習:
    如果您覺得本Demo過于淺顯,您可繼續研究 輕量級開源即時通訊框架MobileIMSDK,本文的Demo正是其極度簡化版。

4、題外話


社區里經常在爭論到底該用MINA還是Netty,比如這幾篇文章:《開源NIO框架八卦——到底是先有MINA還是先有Netty?》、《有關“為何選擇Netty”的11個疑問及解答》、《選Netty還是Mina:深入研究與對比(一)》,哈哈這確實挺難抉擇的。不過,個人觀點是,對那個熟悉就用哪個吧,沒什么好糾結的,必竟二者并比本質區別,也都是出自同一作者之手。

寫個什么樣的Demo?


言歸正傳,本文要演示的Demo包含兩部分,Java UDP客戶端和Netty4 UDP服務端,客戶端將每隔3秒向服務端發送一條消息,而服務端在收到消息后馬上回復一條消息給客戶端。

也就是說,服務端和客戶端都要實現消息的發送和接收,這也就實現了雙向通信。如果有心的話,稍加改造,也就很容易實現一個簡陋的聊天程序了。下節將將給出真正的實現代碼。

5、Netty4服務端準備工作


1第一步:下載Netty4


Netty4的官方網站是:http://netty.io/,直接下最新的Netty 4.1吧,如下圖:

NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]_QQ20160615-0.png

2第二步:找到Netty4的核心庫文件


直接用這個all in one的jar包吧,反正用在服務端,2M大小的東西無所謂,方便管理,見下圖:

NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]_QQ20160615-1.png

3第三步:建好Java工程準備準備開擼


我個人習慣用Eclipse,你用NetBeans或InteliJ也都沒問題,具體建立過程不熟練的衣自行百度吧,唯一注意的是把Netty4的lib包引用進來就行了,我的見下圖:

NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]_QQ20160615-2.png

6、服務端代碼


1服務端主類 EchoServer.java


public class EchoServer
{
        public static void main(String[] args) throws InterruptedException
        {
                Bootstrap b = new Bootstrap();
                EventLoopGroup group = new NioEventLoopGroup();
                b.group(group)
                        .channel(NioDatagramChannel.class)
                        .handler(new EchoSeverHandler());
                
                // 服務端監聽在9999端口
                b.bind(9999).sync().channel().closeFuture().await();
        }
}

如上述代碼所示:不得不說,Netty4的UDP服務端代碼實現起來確實很簡單,一個 Bootstrap、一個 EventLoopGroup、外加一個 SimpleChannelInboundHandler,就這么被Netty4輕松搞定(準確地說Netty4是在Java NIO上的封裝而已,但最終API對開發者來說確實很友好)。

吐個槽:話說Netty4的代碼跟MINA相比,風格確實大不相同,雖說兩者有很深的源源,但經過Netty3、Netty4的進化,兩者的差異(至少代碼看起來是這樣)還是很明顯的。另外,b.bind(9999).sync().channel().closeFuture().await() 這一大串的連續方法調用,看起來很詭異,不小心調錯的話,服務器會不會爆炸?

2服務端Handler類 EchoSeverHandler


public class EchoSeverHandler extends SimpleChannelInboundHandler<DatagramPacket> 
{
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet)
                        throws Exception
        {
                // 讀取收到的數據
                ByteBuf buf = (ByteBuf) packet.copy().content();
                byte[] req = new byte[buf.readableBytes()];
                buf.readBytes(req);
                String body = new String(req, CharsetUtil.UTF_8);
                System.out.println("【NOTE】>>>>>> 收到客戶端的數據:"+body); 
                
                // 回復一條信息給客戶端
                ctx.writeAndFlush(new DatagramPacket(
                Unpooled.copiedBuffer("Hello,我是Server,我的時間戳是"+System.currentTimeMillis()
                                , CharsetUtil.UTF_8)
                                , packet.sender())).sync();
        }
}

如上所示,這個Handler看起來比MINA的類似實現,要簡潔不少。

7、客戶端代碼


為了讓客戶端代碼看起來更簡潔,我把Socket管理代碼提煉到 LocalUDPSocketProvider類、把UDP數據監聽和接收提煉到了 LocalUDPDataReciever類(實際上這兩個同名類是簡化自MobileIMSDK工程哦)。

1客戶端主類 EchoClient.java

public class EchoClient
{
        public static void main(String[] args) throws Exception
        {
                // 初始化本地UDP的Socket
                LocalUDPSocketProvider.getInstance().initSocket();
                // 啟動本地UDP監聽(接收數據用的)
                LocalUDPDataReciever.getInstance().startup();
                
                // 循環發送數據給服務端
                while(true)
                {
                        // 要發送的數據
                        String toServer = "Hi,我是客戶端,我的時間戳"+System.currentTimeMillis();
                        byte[] soServerBytes = toServer.getBytes("UTF-8");
                        
                        // 開始發送
                        boolean ok = UDPUtils.send(soServerBytes, soServerBytes.length);
                        if(ok)
                                Log.d("EchoClient", "發往服務端的信息已送出.");
                        else
                                Log.e("EchoClient", "發往服務端的信息沒有成功發出!!!");
                        
                        // 3000秒后進入下一次循環
                        Thread.sleep(3000);
                }
        }
}

補充說明:客戶端代碼沒有使用任何依賴,純Java UDP代碼實現(如果是Andriod平臺,代碼也幾乎不用改就能用),部分代碼修改自 開源即時通訊框架 MobileIMSDK(去掉了很多保證健壯性代碼,現在看起來要簡潔的多,便于初學者學習)。

2Socket操作類 LocalUDPSocketProvider.java

public class LocalUDPSocketProvider
{
        private static final String TAG = LocalUDPSocketProvider.class.getSimpleName();
        private static LocalUDPSocketProvider instance = null;
        private DatagramSocket localUDPSocket = null;

        public static LocalUDPSocketProvider getInstance()
        {
                if (instance == null)
                        instance = new LocalUDPSocketProvider();
                return instance;
        }
        
        public void initSocket()
        {
                try
                {
                        // UDP本地監聽端口(如果為0將表示由系統分配,否則使用指定端口)
                        this.localUDPSocket = new DatagramSocket(ConfigEntity.localUDPPort);
                        // 調用connect之后,每次send時DatagramPacket就不需要設計目標主機的ip和port了
                        // * 注意:connect方法一定要在DatagramSocket.receive()方法之前調用,
                        // * 不然整send數據將會被錯誤地阻塞。這或許是官方API的bug,也或許是調
                        // * 用規范就應該這樣,但沒有找到官方明確的說明
                        this.localUDPSocket.connect(
                                        InetAddress.getByName(ConfigEntity.serverIP), ConfigEntity.serverUDPPort);
                        this.localUDPSocket.setReuseAddress(true);
                        Log.d(TAG, "new DatagramSocket()已成功完成.");
                }
                catch (Exception e)
                {
                        Log.w(TAG, "localUDPSocket創建時出錯,原因是:" + e.getMessage(), e);
                }
        }

        public DatagramSocket getLocalUDPSocket()
        {
                return this.localUDPSocket;
        }
}

3數據接收類 LocalUDPDataReciever.java

public class LocalUDPDataReciever
{
        private static final String TAG = LocalUDPDataReciever.class.getSimpleName();
        private static LocalUDPDataReciever instance = null;
        private Thread thread = null;

        public static LocalUDPDataReciever getInstance()
        {
                if (instance == null)
                        instance = new LocalUDPDataReciever();
                return instance;
        }

        public void startup()
        {
                this.thread = new Thread(new Runnable()
                {
                        public void run()
                        {
                                try
                                {
                                        Log.d(LocalUDPDataReciever.TAG, "本地UDP端口偵聽中,端口=" + ConfigEntity.localUDPPort + "...");

                                        //開始偵聽
                                        LocalUDPDataReciever.this.udpListeningImpl();
                                }
                                catch (Exception eee)
                                {
                                        Log.w(LocalUDPDataReciever.TAG, "本地UDP監聽停止了(socket被關閉了?)," + eee.getMessage(), eee);
                                }
                        }
                });
                this.thread.start();
        }

        private void udpListeningImpl() throws Exception
        {
                while (true)
                {
                        byte[] data = new byte[1024];
                        // 接收數據報的包
                        DatagramPacket packet = new DatagramPacket(data, data.length);

                        DatagramSocket localUDPSocket = LocalUDPSocketProvider.getInstance().getLocalUDPSocket();
                        if ((localUDPSocket == null) || (localUDPSocket.isClosed()))
                                continue;
                        
                        // 阻塞直到收到數據
                        localUDPSocket.receive(packet);
                        
                        // 解析服務端發過來的數據
                        String pFromServer = new String(packet.getData(), 0 , packet.getLength(), "UTF-8");
                        Log.w(LocalUDPDataReciever.TAG, "【NOTE】>>>>>> 收到服務端的消息:"+pFromServer);
                }
        }
}

8、運行效果


客戶端運行結果:
NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]_QQ20160615-3.png

服務端運行結果:
NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]_QQ20160615-4.png

9、補充說明


客戶端代碼沒什么特別,就是標準的Java UDP代碼,看起來跟其它例子不一樣的原因只是我把它提煉了一下,沒本質區別。同樣的代碼改改也可以很好的用在Android端。實際上,上面的客戶端代碼就是從開源 MobileIMSDK 的Java端扒出來的,有興趣的也可以看看它的Android端Server端iOS端,簡化一下可以用作你自已的各種用途。

10、更多學習資源


[1] MINA和Netty的源碼在線學習和查閱:
MINA-2.x地址是:http://docs.52im.net/extend/docs/src/mina2/
MINA-1.x地址是:http://docs.52im.net/extend/docs/src/mina1/
Netty-4.x地址是:http://docs.52im.net/extend/docs/src/netty4/
Netty-3.x地址是:http://docs.52im.net/extend/docs/src/netty3/

[2] MINA和Netty的API文檔在線查閱:
MINA-2.x API文檔(在線版):http://docs.52im.net/extend/docs/api/mina2/
MINA-1.x API文檔(在線版):http://docs.52im.net/extend/docs/api/mina1/
Netty-4.x API文檔(在線版):http://docs.52im.net/extend/docs/api/netty4/
Netty-3.x API文檔(在線版):http://docs.52im.net/extend/docs/api/netty3/

[3] 更多有關NIO編程的資料:
請進入精華資料專輯:http://www.uktmgv.tw/forum.php?mod=collection&action=view&ctid=9

[4] 有關IM聊天應用、消息推送技術的資料:
請進入精華資料專輯:http://www.uktmgv.tw/forum.php?mod=collection&op=all

[5] 技術交流和學習:
可直接進入 即時通訊開發者社區 討論和學習網絡編程、IM聊天應用、消息推送應用的開發。

11、完整源碼工程下載


客戶端_echo_client_udp.rar (16.08 KB , 下載次數: 756 , 售價: 2 金幣)
服務端_netty4_echo_server_udp.rar (2.87 MB , 下載次數: 13494 , 售價: 2 金幣)

附錄1:全站精品資源下載


[1] 精品源碼下載:
輕量級即時通訊框架MobileIMSDK的iOS源碼(開源版)[附件下載]
開源IM工程“蘑菇街TeamTalk”2015年5月前未刪減版完整代碼 [附件下載]
微信本地數據庫破解版(含iOS、Android),僅供學習研究 [附件下載]
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]
NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]
NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 [附件下載]
NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]
用于IM中圖片壓縮的Android工具類源碼,效果可媲美微信 [附件下載]
高仿Android版手機QQ可拖拽未讀數小氣泡源碼 [附件下載]
一個WebSocket實時聊天室Demo:基于node.js+socket.io [附件下載]
Android聊天界面源碼:實現了聊天氣泡、表情圖標(可翻頁) [附件下載]
高仿Android版手機QQ首頁側滑菜單源碼 [附件下載]
開源libco庫:單機千萬連接、支撐微信8億用戶的后臺框架基石 [源碼下載]
分享java AMR音頻文件合并源碼,全網最全
微信團隊原創Android資源混淆工具:AndResGuard [有源碼]
一個基于MQTT通信協議的完整Android推送Demo [附件下載]
Android版高仿微信聊天界面源碼 [附件下載]

[2] 精品文檔和工具下載:
計算機網絡通訊協議關系圖(中文珍藏版)[附件下載]
史上最全即時通訊軟件簡史(精編大圖版)[附件下載]
基于RTMP協議的流媒體技術的原理與應用(技術論文)[附件下載]
獨家發布《TCP/IP詳解 卷1:協議》CHM版 [附件下載]
良心分享:WebRTC 零基礎開發者教程(中文)[附件下載]
MQTT協議手冊(中文翻譯版)[附件下載]
經典書籍《UNIX網絡編程》最全下載(卷1+卷2、中文版+英文版)[附件下載]
音視頻開發理論入門書籍之《視頻技術手冊(第5版)》[附件下載]
國際電聯H.264視頻編碼標準官方技術手冊(中文版)[附件下載]
Apache MINA2.0 開發指南(中文版)[附件下載]
網絡通訊數據抓包和分析工具 Wireshark 使用教程(中文) [附件下載]
最新收集NAT穿越(p2p打洞)免費STUN服務器列表 [附件下載]
高性能網絡編程經典:《The C10K problem(英文)》[附件下載]
即時通訊系統的原理、技術和應用(技術論文)[附件下載]
技術論文:微信對網絡影響的技術試驗及分析[附件下載]
華為內部3G網絡資料: WCDMA系統原理培訓手冊[附件下載]
網絡測試:Android版多路ping命令工具EnterprisePing[附件下載]
Android反編譯利器APKDB:沒有美工的日子里繼續堅強的擼
一款用于P2P開發的NAT類型檢測工具 [附件下載]
兩款增強型Ping工具:持續統計、圖形化展式網絡狀況 [附件下載]

[3] 精選視頻、演講PPT下載:
QQ空間移動端10億級視頻播放技術優化揭秘(視頻+PPT)[附件下載]
RTC實時互聯網2017年度大會精選演講PPT [附件下載]
微信分享開源IM網絡層組件庫Mars的技術實現(視頻+PPT)[附件下載]
微服務理念在微信海量用戶后臺架構中的實踐(視頻+PPT)[附件下載]
移動端IM開發和構建中的技術難點實踐分享(視頻+PPT)[附件下載]
網易云信的高品質即時通訊技術實踐之路(視頻+PPT)[附件下載]
騰訊音視頻實驗室:直面音視頻質量評估之痛(視頻+PPT)[附件下載]
騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT[附件下載]
微信朋友圈海量技術之道PPT[附件下載]
手機淘寶消息推送系統的架構與實踐(音頻+PPT)[附件下載]
如何進行實時音視頻的質量評估與監控(視頻+PPT)[附件下載]
Go語言構建高并發消息推送系統實踐PPT(來自360公司)[附件下載]
網易IM云千萬級并發消息處理能力的架構設計與實踐PPT [附件下載]
手機QQ的海量用戶移動化實踐分享(視頻+PPT)[附件下載]
釘釘——基于IM技術的新一代企業OA平臺的技術挑戰(視頻+PPT)[附件下載]
微信技術總監談架構:微信之道——大道至簡(PPT講稿)[附件下載]
Netty的架構剖析及應用案例介紹(視頻+PPT)[附件下載]
聲網架構師談實時音視頻云的實現難點(視頻采訪)
滴滴打車架構演變及應用實踐(PPT講稿)[附件下載]
微信海量用戶背后的后臺系統存儲架構(視頻+PPT)[附件下載]
在線音視頻直播室服務端架構最佳實踐(視頻+PPT)[附件下載]
從0到1:萬人在線的實時音視頻直播技術實踐分享(視頻+PPT)[附件下載]
微信移動端應對弱網絡情況的探索和實踐PPT[附件下載]
Android版微信從300KB到30MB的技術演進(PPT講稿)[附件下載]

附錄2:全站即時通訊技術資料分類


[1] 網絡編程基礎資料:
TCP/IP詳解 - 第11章·UDP:用戶數據報協議
TCP/IP詳解 - 第17章·TCP:傳輸控制協議
TCP/IP詳解 - 第18章·TCP連接的建立與終止
TCP/IP詳解 - 第21章·TCP的超時與重傳
技術往事:改變世界的TCP/IP協議(珍貴多圖、手機慎點)
通俗易懂-深入理解TCP協議(上):理論基礎
通俗易懂-深入理解TCP協議(下):RTT、滑動窗口、擁塞處理
理論經典:TCP協議的3次握手與4次揮手過程詳解
理論聯系實際:Wireshark抓包分析TCP 3次握手、4次揮手過程
計算機網絡通訊協議關系圖(中文珍藏版)
UDP中一個包的大小最大能多大?
P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介
P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解
P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解
通俗易懂:快速理解P2P技術中的NAT穿透原理
高性能網絡編程(一):單臺服務器并發TCP連接數到底可以有多少
高性能網絡編程(二):上一個10年,著名的C10K并發連接問題
高性能網絡編程(三):下一個10年,是時候考慮C10M并發問題了
高性能網絡編程(四):從C10K到C10M高性能網絡應用的理論探索
不為人知的網絡編程(一):淺析TCP協議中的疑難雜癥(上篇)
不為人知的網絡編程(二):淺析TCP協議中的疑難雜癥(下篇)
不為人知的網絡編程(三):關閉TCP連接時為什么會TIME_WAIT、CLOSE_WAIT
不為人知的網絡編程(四):深入研究分析TCP的異常關閉
不為人知的網絡編程(五):UDP的連接性和負載均衡
不為人知的網絡編程(六):深入地理解UDP協議并用好它
網絡編程懶人入門(一):快速理解網絡通信協議(上篇)
網絡編程懶人入門(二):快速理解網絡通信協議(下篇)
網絡編程懶人入門(三):快速理解TCP協議一篇就夠
網絡編程懶人入門(四):快速理解TCP和UDP的差異
Netty干貨分享:京東京麥的生產級TCP網關技術實踐總結
>> 更多同類文章 ……

[2] NIO異步網絡編程資料:
Java新一代網絡編程模型AIO原理及Linux系統AIO介紹
有關“為何選擇Netty”的11個疑問及解答
開源NIO框架八卦——到底是先有MINA還是先有Netty?
選Netty還是Mina:深入研究與對比(一)
選Netty還是Mina:深入研究與對比(二)
NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示
NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示
NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰
Netty 4.x學習(一):ByteBuf詳解
Netty 4.x學習(二):Channel和Pipeline詳解
Netty 4.x學習(三):線程模型詳解
Apache Mina框架高級篇(一):IoFilter詳解
Apache Mina框架高級篇(二):IoHandler詳解
MINA2 線程原理總結(含簡單測試實例)
Apache MINA2.0 開發指南(中文版)[附件下載]
MINA、Netty的源代碼(在線閱讀版)已整理發布
解決MINA數據傳輸中TCP的粘包、缺包問題(有源碼)
解決Mina中多個同類型Filter實例共存的問題
實踐總結:Netty3.x升級Netty4.x遇到的那些坑(線程篇)
實踐總結:Netty3.x VS Netty4.x的線程模型
詳解Netty的安全性:原理介紹、代碼演示(上篇)
詳解Netty的安全性:原理介紹、代碼演示(下篇)
詳解Netty的優雅退出機制和原理
NIO框架詳解:Netty的高性能之道
Twitter:如何使用Netty 4來減少JVM的GC開銷(譯文)
絕對干貨:基于Netty實現海量接入的推送服務技術要點
Netty干貨分享:京東京麥的生產級TCP網關技術實踐總結
>> 更多同類文章 ……

[3] 有關IM/推送的通信格式、協議的選擇:
簡述傳輸層協議TCP和UDP的區別
為什么QQ用的是UDP協議而不是TCP協議?
移動端即時通訊協議選擇:UDP還是TCP?
如何選擇即時通訊應用的數據傳輸格式
強列建議將Protobuf作為你的即時通訊應用數據傳輸格式
全方位評測:Protobuf性能到底有沒有比JSON快5倍?
移動端IM開發需要面對的技術問題(含通信協議選擇)
簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端
理論聯系實際:一套典型的IM通信協議設計詳解
58到家實時消息系統的協議設計等技術實踐分享
詳解如何在NodeJS中使用Google的Protobuf
>> 更多同類文章 ……

[4] 有關IM/推送的心跳保活處理:
應用保活終極總結(一):Android6.0以下的雙進程守護保活實踐
應用保活終極總結(二):Android6.0及以上的保活實踐(進程防殺篇)
應用保活終極總結(三):Android6.0及以上的保活實踐(被殺復活篇)
Android進程保活詳解:一篇文章解決你的所有疑問
Android端消息推送總結:實現原理、心跳保活、遇到的問題等
深入的聊聊Android消息推送這件小事
為何基于TCP協議的移動端IM仍然需要心跳保活機制?
微信團隊原創分享:Android版微信后臺保活實戰分享(進程保活篇)
微信團隊原創分享:Android版微信后臺保活實戰分享(網絡保活篇)
移動端IM實踐:實現Android版微信的智能心跳機制
移動端IM實踐:WhatsApp、Line、微信的心跳策略分析
>> 更多同類文章 ……

[5] 有關WEB端即時通訊開發:
新手入門貼:史上最全Web端即時通訊技術原理詳解
Web端即時通訊技術盤點:短輪詢、Comet、Websocket、SSE
SSE技術詳解:一種全新的HTML5服務器推送事件技術
Comet技術詳解:基于HTTP長連接的Web端實時通信技術
新手快速入門:WebSocket簡明教程
WebSocket詳解(一):初步認識WebSocket技術
WebSocket詳解(二):技術原理、代碼演示和應用案例
WebSocket詳解(三):深入WebSocket通信協議細節
socket.io實現消息推送的一點實踐及思路
LinkedIn的Web端即時通訊實踐:實現單機幾十萬條長連接
Web端即時通訊技術的發展與WebSocket、Socket.io的技術實踐
Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)
開源框架Pomelo實踐:搭建Web端高性能分布式IM聊天服務器
使用WebSocket和SSE技術實現Web端消息推送
詳解Web端通信方式的演進:從Ajax、JSONP 到 SSE、Websocket
>> 更多同類文章 ……

[6] 有關IM架構設計:
淺談IM系統的架構設計
簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端
一套海量在線用戶的移動端IM架構設計實踐分享(含詳細圖文)
一套原創分布式即時通訊(IM)系統理論架構方案
從零到卓越:京東客服即時通訊系統的技術架構演進歷程
蘑菇街即時通訊/IM服務器開發之架構選擇
騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT
微信后臺基于時間序的海量數據冷熱分級架構設計實踐
微信技術總監談架構:微信之道——大道至簡(演講全文)
如何解讀《微信技術總監談架構:微信之道——大道至簡》
快速裂變:見證微信強大后臺架構從0到1的演進歷程(一)
17年的實踐:騰訊海量產品的技術方法論
移動端IM中大規模群消息的推送如何保證效率、實時性?
現代IM系統中聊天消息的同步和存儲方案探討
>> 更多同類文章 ……

[7] 有關IM安全的文章:
即時通訊安全篇(一):正確地理解和使用Android端加密算法
即時通訊安全篇(二):探討組合加密算法在IM中的應用
即時通訊安全篇(三):常用加解密算法與通訊安全講解
即時通訊安全篇(四):實例分析Android中密鑰硬編碼的風險
即時通訊安全篇(五):對稱加密技術在Android平臺上的應用實踐
即時通訊安全篇(六):非對稱加密技術的原理與應用實踐
傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示
理論聯系實際:一套典型的IM通信協議設計詳解(含安全層設計)
微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解
來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享
簡述實時音視頻聊天中端到端加密(E2EE)的工作原理
移動端安全通信的利器——端到端加密(E2EE)技術詳解
Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)
通俗易懂:一篇掌握即時通訊的消息傳輸安全原理
>> 更多同類文章 ……

[8] 有關實時音視頻開發:
專訪微信視頻技術負責人:微信實時視頻聊天技術的演進
即時通訊音視頻開發(一):視頻編解碼之理論概述
即時通訊音視頻開發(二):視頻編解碼之數字視頻介紹
即時通訊音視頻開發(三):視頻編解碼之編碼基礎
即時通訊音視頻開發(四):視頻編解碼之預測技術介紹
即時通訊音視頻開發(五):認識主流視頻編碼技術H.264
即時通訊音視頻開發(六):如何開始音頻編解碼技術的學習
即時通訊音視頻開發(七):音頻基礎及編碼原理入門
即時通訊音視頻開發(八):常見的實時語音通訊編碼標準
即時通訊音視頻開發(九):實時語音通訊的回音及回音消除概述
即時通訊音視頻開發(十):實時語音通訊的回音消除技術詳解
即時通訊音視頻開發(十一):實時語音通訊丟包補償技術詳解
即時通訊音視頻開發(十二):多人實時音視頻聊天架構探討
即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢
即時通訊音視頻開發(十四):實時音視頻數據傳輸協議介紹
即時通訊音視頻開發(十五):聊聊P2P與實時音視頻的應用情況
即時通訊音視頻開發(十六):移動端實時音視頻開發的幾個建議
即時通訊音視頻開發(十七):視頻編碼H.264、VP8的前世今生
實時語音聊天中的音頻處理與編碼壓縮技術簡述
網易視頻云技術分享:音頻處理與壓縮技術快速入門
學習RFC3550:RTP/RTCP實時傳輸協議基礎知識
簡述開源實時音視頻技術WebRTC的優缺點
良心分享:WebRTC 零基礎開發者教程(中文)
開源實時音視頻技術WebRTC中RTP/RTCP數據傳輸協議的應用
基于RTMP數據傳輸協議的實時流媒體技術研究(論文全文)
聲網架構師談實時音視頻云的實現難點(視頻采訪)
淺談開發實時視頻直播平臺的技術要點
還在靠“喂喂喂”測試實時語音通話質量?本文教你科學的評測方法!
實現延遲低于500毫秒的1080P實時音視頻直播的實踐分享
移動端實時視頻直播技術實踐:如何做到實時秒開、流暢不卡
如何用最簡單的方法測試你的實時音視頻方案
技術揭秘:支持百萬級粉絲互動的Facebook實時視頻直播
簡述實時音視頻聊天中端到端加密(E2EE)的工作原理
移動端實時音視頻直播技術詳解(一):開篇
移動端實時音視頻直播技術詳解(二):采集
移動端實時音視頻直播技術詳解(三):處理
移動端實時音視頻直播技術詳解(四):編碼和封裝
移動端實時音視頻直播技術詳解(五):推流和傳輸
移動端實時音視頻直播技術詳解(六):延遲優化
理論聯系實際:實現一個簡單地基于HTML5的實時視頻直播
IM實時音視頻聊天時的回聲消除技術詳解
淺談實時音視頻直播中直接影響用戶體驗的幾項關鍵技術指標
如何優化傳輸機制來實現實時音視頻的超低延遲?
首次披露:快手是如何做到百萬觀眾同場看直播仍能秒開且不卡頓的?
實時通信RTC技術棧之:視頻編解碼
開源實時音視頻技術WebRTC在Windows下的簡明編譯教程
Android直播入門實踐:動手搭建一套簡單的直播系統
>> 更多同類文章 ……

[9] IM開發綜合文章:
移動端IM中大規模群消息的推送如何保證效率、實時性?
移動端IM開發需要面對的技術問題
開發IM是自己設計協議用字節流好還是字符流好?
請問有人知道語音留言聊天的主流實現方式嗎?
IM消息送達保證機制實現(一):保證在線實時消息的可靠投遞
IM消息送達保證機制實現(二):保證離線消息的可靠投遞
如何保證IM實時消息的“時序性”與“一致性”?
一個低成本確保IM消息時序的方法探討
IM單聊和群聊中的在線狀態同步應該用“推”還是“拉”?
IM群聊消息如此復雜,如何保證不丟不重?
談談移動端 IM 開發中登錄請求的優化
移動端IM登錄時拉取數據如何作到省流量?
淺談移動端IM的多點登陸和消息漫游原理
完全自已開發的IM該如何設計“失敗重試”機制?
通俗易懂:基于集群的移動端IM接入層負載均衡方案分享
微信對網絡影響的技術試驗及分析(論文全文)
即時通訊系統的原理、技術和應用(技術論文)
開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀
QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)
QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)
騰訊原創分享(一):如何大幅提升移動網絡下手機QQ的圖片傳輸速度和成功率
騰訊原創分享(二):如何大幅壓縮移動網絡下APP的流量消耗(上篇)
騰訊原創分享(二):如何大幅壓縮移動網絡下APP的流量消耗(下篇)
如約而至:微信自用的移動端IM網絡層跨平臺組件庫Mars已正式開源
基于社交網絡的Yelp是如何實現海量用戶圖片的無損壓縮的?
>> 更多同類文章 ……

[10] 開源移動端IM技術框架資料:
開源移動端IM技術框架MobileIMSDK:快速入門
開源移動端IM技術框架MobileIMSDK:常見問題解答
開源移動端IM技術框架MobileIMSDK:壓力測試報告
>> 更多同類文章 ……

[11] 有關推送技術的文章:
iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等
信鴿團隊原創:一起走過 iOS10 上消息推送(APNS)的坑
Android端消息推送總結:實現原理、心跳保活、遇到的問題等
掃盲貼:認識MQTT通信協議
一個基于MQTT通信協議的完整Android推送Demo
IBM技術經理訪談:MQTT協議的制定歷程、發展現狀等
求教android消息推送:GCM、XMPP、MQTT三種方案的優劣
移動端實時消息推送技術淺析
掃盲貼:淺談iOS和Android后臺實時消息推送的原理和區別
絕對干貨:基于Netty實現海量接入的推送服務技術要點
移動端IM實踐:谷歌消息推送服務(GCM)研究(來自微信)
為何微信、QQ這樣的IM工具不使用GCM服務推送消息?
極光推送系統大規模高并發架構的技術實踐分享
從HTTP到MQTT:一個基于位置服務的APP數據通信實踐概述
魅族2500萬長連接的實時消息推送架構的技術實踐分享
專訪魅族架構師:海量長連接的實時消息推送系統的心得體會
深入的聊聊Android消息推送這件小事
基于WebSocket實現Hybrid移動應用的消息推送實踐(含代碼示例)
一個基于長連接的安全可擴展的訂閱/推送服務實現思路
實踐分享:如何構建一套高可用的移動端消息推送系統?
Go語言構建千萬級在線的高并發消息推送系統實踐(來自360公司)
騰訊信鴿技術分享:百億級實時消息推送的實戰經驗
百萬在線的美拍直播彈幕系統的實時推送技術實踐之路
>> 更多同類文章 ……

[12] 更多即時通訊技術好文分類:
http://www.uktmgv.tw/forum.php?mod=collection&op=all

即時通訊網 - 即時通訊開發者社區! 來源: - 即時通訊開發者社區!

標簽:UDP Netty

評分

2

查看評分

上一篇:輕量級即時通訊框架MobileIMSDK的iOS源碼(開源版)[附件下載]下一篇:NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 [附件下載]

本帖已收錄至以下技術專輯

推薦方案
評論 88
新手福音,感謝分享!
簽名: 該會員沒有填寫今日想說內容.
版主666666
非常棒 ,學習了
引用:singleton 發表于 2016-06-15 14:16
非常棒 ,學習了

簽名: 感覺什么也不缺,就缺錢。。
多點這種入門的文章挺好,代碼一定要能運行且最好能演示最佳實踐,這樣對初學者就大有裨益。
簽名: 國慶長假還沒有緩過來,請讓我靜一靜,產品狗死遠點...
提示: 該帖被管理員或版主屏蔽
非常好,收藏
可以的  下載來看看
太好了正要學習這個!!
注冊就為支持院長
簽名: 該會員沒有填寫今日想說內容.
引用:木子鳳 發表于 2016-08-04 17:16
注冊就為支持院長

簽名: 感覺什么也不缺,就缺錢。。
感謝分享!確實對新手很有用!
感謝分享,學習了。
簽名: ,,,,,
怎么下載不了呢??
引用:haoyanjun21 發表于 2016-09-10 17:11
怎么下載不了呢??

可以下載
簽名: 感覺什么也不缺,就缺錢。。
非常棒 ,學習了
感謝分享,學習了。
簽名:
感謝分享,學習了。
簽名:
謝謝
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
曾氏料二肖中特