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

前言


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

本文將演示的是一個基于MINA2的UDP服務端和一個標準UDP客戶端(Java實現)雙向通信的完整例子。

實際上,MINA2的官方代碼里有完整的UDP通信Demo代碼,但Demo里客戶端是需要依賴MINA2的客戶端庫的,而如果簡單地去掉MINA2的lib依賴,改為標準的Java UDP代碼,則服務端和客戶端的數據收發都會存在未知多余字節等。當然,本文已解決了這些問題,請繼續往下閱讀。

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

《NIO框架入門》系列文章


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

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


本文亮點


  • Demo中的代碼源自作者的開源工程,有實用價值:
    源碼均修改自作者的即時通訊開源工程 MobileIMSDK,只是為了方便學習理解而作了簡化,有一定的實用價值;
  • 本例中客戶端UDP實現無需第3方依賴:
    通常MINA或Netty的例子里,客戶端也都是用的MINA或Netty的客戶端lib,本文將直接使用標準UDP代碼(便于跨平臺實現,比如iOS平臺),不依賴于第3方包;
  • 完整可執行源碼、方便學習:
    完整的Demo源碼,適合新手直接運行,便于學習和研究。
  • 生產環境下的進階學習:
    如果您覺得本Demo過于淺顯,您可繼續研究 輕量級開源即時通訊框架MobileIMSDK,本文的Demo正是其極度簡化版。

Demo的代碼邏輯


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

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

補充一句,本文中的客戶端代碼跟系列文章中的上篇《NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示》,用的是相同的代碼,如果您正在評估MIN2和Netty4的UDP服務端區別,可對照著上篇,進行詳細對照和分析哦。

MINA2服務端準備工作


1第一步:下載MINA2


MINA2的官方網站是:http://mina.apache.org/,最新版本是 Mina 2.0.13,如下圖:

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

補充說明:建議2進制和源碼都下載下來,2進制制包中是編譯好的jar包,源碼包中包含了官方的Demo源代碼,需要的時候可以對照著看看,對于最佳實踐來說,有一定的參考價值。

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


一般情況下,只需要mina-core-2.0.13.jar包就行了,見下圖:

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

補充說明:因為MINA2中使用了slf日框架,需要找到相應的lib才能最終運行,具體下一段再說明。

3第三步:建好MINA2的服務端Java工程,準備開擼


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

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

補充說明:MINA2中需要的slf日志框架的jar包,主要額外找到并導進來,不然不能最終運行哦。你也可以下載本Demo中的服務端源碼,直接用就是了。

服務端代碼實現


1服務端主類 EchoServer.java

public class EchoServer
{
        private static Logger logger = LoggerFactory.getLogger(EchoServer.class);
        
        public static void main(String[] args) throws Exception
        {
                // ** Acceptor設置
                NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
                // 此行代碼能讓你的程序整體性能提升10倍
                acceptor.getFilterChain()
                        .addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); 
                // 設置MINA2的IoHandler實現類
                acceptor.setHandler(new EchoSeverHandler());
                // 設置會話超時時間(單位:毫秒),不設置則默認是10秒,請按需設置
                acceptor.setSessionRecycler(new ExpiringSessionRecycler(15 * 1000));
                
                // ** UDP通信配置
                DatagramSessionConfig dcfg = acceptor.getSessionConfig();
                dcfg.setReuseAddress(true);
                // 設置輸入緩沖區的大小,壓力測試表明:調整到2048后性能反而降低
                dcfg.setReceiveBufferSize(1024);
                // 設置輸出緩沖區的大小,壓力測試表明:調整到2048后性能反而降低
                dcfg.setSendBufferSize(1024);
            
                // ** UDP服務端開始偵聽
                acceptor.bind(new InetSocketAddress(9999));
            
                logger.info("[IMCORE]UDP服務器正在端口 9999 上監聽中...");
        }
}

補充說明:MINA2的UDP服務端看起來比Netty4的要繁瑣一些(有關Netty4的UDP服務端請見:http://www.emxvra.tw/thread-367-1-1.html,實際上MINA2的代碼風格更符合一般程序員的編碼習慣,更好懂一些,而Netty4因歷經多個大版本的進化,看起來非常簡潔,但實現上并沒有MINA2看起來那么直觀。當然,僅是個人理解,不當之外請見諒。

2服務端Handler類 EchoSeverHandler.java

public class EchoSeverHandler extends IoHandlerAdapter
{
    private static Logger logger = LoggerFactory.getLogger(EchoSeverHandler.class);  
    public static final CharsetDecoder decoder = (Charset.forName("UTF-8")).newDecoder();
        
    /**
     * MINA的異常回調方法。
     * <p>
     * 本類中將在異常發生時,立即close當前會話。
     * 
     * @param session 發生異常的會話
     * @param cause 異常內容
     * @see IoSession#close(boolean)
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception 
    {
        logger.error("[IMCORE]exceptionCaught捕獲到錯了,原因是:"+cause.getMessage(), cause);
        session.close(true);
    }
        
    /**
     * MINA框架中收到客戶端消息的回調方法。
     * <p>
     * 本類將在此方法中實現完整的即時通訊數據交互和處理策略。
     * <p>
     * 為了提升并發性能,本方法將運行在獨立于MINA的IoProcessor之外的線程池中,
     * 詳見 {@link ServerLauncher#initAcceptor()}中的MINA設置代碼 。
     * 
     * @param session 收到消息對應的會話引用
     * @param message 收到的MINA的原始消息封裝對象,本類中是 {@link IoBuffer}對象
     * @throws Exception 當有錯誤發生時將拋出異常
     */
    @Override
    public void messageReceived(IoSession session, Object message)throws Exception 
    {
            //*********************************************** 接收數據
            // 讀取收到的數據
            IoBuffer buffer = (IoBuffer) message;
            String body = buffer.getString(decoder);
            // 注意:當客戶使用不依賴于MINA庫的情況下,以下官方推
            // 薦的讀取方法會在數據首部出現幾個字節的未知亂碼
            // message.toString()
            logger.debug("【NOTE】>>>>>> 收到客戶端的數據:"+body); 
            
            //*********************************************** 回復數據
            String strToClient = "Hello,我是Server,我的時間戳是"+System.currentTimeMillis();
            byte[] res = strToClient.getBytes("UTF-8");
        // 組織IoBuffer數據包的方法:本方法才可以正確地讓客戶端UDP收到byte數組
            IoBuffer buf = IoBuffer.wrap(res);  
                
            // 向客戶端寫數據
            WriteFuture future = session.write(buf);  
            // 在100毫秒超時間內等待寫完成
            future.awaitUninterruptibly(100);
            // The message has been written successfully
            if( future.isWritten() )
            {
                        // send sucess!
            }
            // The messsage couldn't be written out completely for some reason.
            // (e.g. Connection is closed)
            else
            {
                        logger.warn("[IMCORE]回復給客戶端的數據發送失敗!");
            }
    }
}


3重要說明


注意點1:服務端的EchoSeverHandler.java文件中,接收數據時取得文本內容的兩行代碼是解決無MINA2客戶端依賴的關鍵,具體代碼如下:
IoBuffer buffer = (IoBuffer) message;
String body = buffer.getString(decoder);
而官方的代碼是直接:message.toString(),這會存在不能正確地解碼標準Java UDP代碼實現的客戶端發過來的數據問題哦。

注意點2:服務端的EchoSeverHandler.java文件中,發送數據時的IoBuffer對象組織方法是解決無MINA2客戶端依賴的客戶端能正確接收MINA2服務端發過去的數據的關鍵,具體代碼如下:
IoBuffer buf = IoBuffer.wrap(res);  
而官方的Demo代碼以及網上的各種實現更為復雜,但會導致客戶端接收數據有多余字節,官方的會產生多余字節和亂碼的代碼如下:
IoBuffer buf = IoBuffer.allocate(res.length);  
buf.setAutoExpand(true);  
buf.putInt(res.length);
buf.put(res);  
buf.flip();
buf.shrink();

客戶端代碼實現


為了讓客戶端代碼看起來更簡潔,我把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);
                }
        }
}

Demo執行效果


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

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

補充說明:服務端的運行結果中,控制臺下每次多出的4行log輸出,實際上是MINA2內部代碼的debug信息,目前除非關閉整個log的輸出,不然它一定會出現,希望你在運行代碼時看到這莫名其妙的4行log內容,不要感到奇怪哦,這4行log大致內容如下所示:
[DEBUG] - [13:26:36.393]Event MESSAGE_RECEIVED has been fired for session 1 | (IoFilterEvent^fire:117)
[DEBUG] - [13:26:36.393]Firing a MESSAGE_SENT event for session 1 | (IoFilterEvent^fire:68)
[DEBUG] - [13:26:36.393]Event MESSAGE_SENT has been fired for session 1 | (IoFilterEvent^fire:117)
[DEBUG] - [13:26:39.393]Firing a MESSAGE_RECEIVED event for session 1 | (IoFilterEvent^fire:68)

結語


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

如果你閱讀過本系列的上一篇《NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示》,應該能明顯地感覺的出來MINA2的UDP服務端API接口使用要是Netty4的繁瑣,而且MINA2還存在獨立客戶端(非依賴于MINA2客戶端)實現時的多余字節和亂碼問題。但個人認為MINA2的代碼風格更符合一般程序員的編碼習慣,更好懂一些,而Netty4因歷經多個大版本的進化,雖起來非常簡潔,但實現并不是那么直觀。當然,至于MINA還是Netty,請客觀一評估和使用,因為二者并無本質區別。

更多學習資源


[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.emxvra.tw/forum.php?mod=collection&action=view&ctid=9

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

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

完整源碼工程下載


客戶端_echo_client_udp.rar (16.08 KB , 下載次數: 191 , 售價: 2 金幣)
服務端_mina2_echo_server_udp.rar (1019.96 KB , 下載次數: 273 , 售價: 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.emxvra.tw/forum.php?mod=collection&op=all

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

標簽:UDP MINA
上一篇:NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 [附件下載]下一篇:NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]

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

推薦方案
評論 17
圖文并茂,很好很好!
寫的很不錯,樓主幸苦了
收藏,收藏
mark,不錯
感謝分享,學習了。
簽名:
學習了,謝謝分享
學習學習
看看看看這
金幣不夠
非常感謝,可以學習一下
學習一下哈哈哈
簽名: 該會員沒有填寫今日想說內容.
非常nice
不錯 很厲害 漲知識了
為什么我有2金幣也不能購買?
引用:tonben 發表于 2018-02-05 13:02
為什么我有2金幣也不能購買?

再點一次試試
簽名: 又是精神萎靡的一天,真美好。。
支持以西
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
777彩票走势图表