默認
打賞 發表評論 16
想開發IM:買成品怕坑?租第3方怕貴?找開源自已擼?盡量別走彎路了... 找站長給點建議
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]
閱讀(70941) | 評論(16 收藏10 淘帖4 2

概述


本文演示的是一個Android客戶端程序,通過UDP協議與兩個典型的NIO框架服務端,實現跨平臺雙向通信的完整Demo

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

本文中,服務端將分別用MINA2和Netty4進行實現,但在你實際的項目中服務端實現只需選其一就行了。本文中的Demo同時用MINA2和Netty4分別實現服務端的目的,是因為很多人都在糾結到底是用MINA還是Netty來實現高并發的Java網絡通信服務端,在此干脆兩個都實現了,就看你怎么選擇。

實際上,MINA2和Netty4的官方代碼里有UDP通信的Demo代碼,但卻不存在針對移動端(主要是Android和iOS端)的Demo,本文將演示用Android客戶端來實現這種跨平臺的雙向網絡通信。Demo中,已經解決跨平臺通信時的常見的亂碼、數據字節異常等問題,如覺得有用,你可直接使用之。

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

《NIO框架入門》系列文章


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

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


本篇亮點


  • 客戶端基于Android移動端平臺:
    直接使用Android的標準UDP代碼,不依賴第3方包,且已解決與Java NIO服務端的跨平臺通信問題,是個難得的Android端實踐入門示例;
  • 完整可執行源碼、方便學習:
    完整的Demo源碼,適合新手直接運行,便于學習和研究。
  • Demo中的代碼源自作者的開源工程,有實用價值:
    源碼均修改自作者的即時通訊開源工程 MobileIMSDK,只是為了方便學習理解而作了簡化,有一定的實用價值;
  • 生產環境下的進階學習:
    如果您覺得本Demo過于淺顯,您可繼續研究 輕量級開源即時通訊框架MobileIMSDK,本文的Demo正是其極度簡化版。

本文中Demo演示的功能


本文中的Demo代碼實現包含兩部分,Android UDP客戶端和NIO框架實現的服務端(包括MINA2和Netty4實現兩個方案),客戶端每隔5秒向服務端發送消息,而服務端在收到消息后馬上回復一條消息給客戶端。

如上所述,服務端(PC服務器)和客戶端(Android移動端)都要實現消息的發送和接收,即實現跨平臺的雙向通信。下節將將給出真正的實現代碼。

Android客戶端準備工作


1Step 1:準備好開發環境


這兩年,Google官方已經基本放棄Eclipse+ADT這樣的IDE組合,轉而大力開發Android Studio,但不得不承認,由于我的OS仍然是XP(Android Studio不支持XP),所以Eclipse+ADT還得繼續用(這個組合雖然一直被吐槽,但又不得不用)。

如果你習慣使用Eclipse+ADT這樣的IDE,可以下載我打好包的版本,內含Eclipse4.2+ADT+Android SDK:
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_QQ20160628-0.png

如果你需要Android Studio,可進入此鏈接下載

2Step 2:新建一個普通的Android工程,準備開擼


本文以Eclipse+ADT為開發Android開發工具(如你使用Android Studio道理也是一樣的),按照提示新建工程即可,無需特殊的設置或其它前前置條件。

我建好的工程,如下圖所示(很多都是默認生成的,用不上的東西就別去管它了):
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_2.png

補充說明:因為需要進行網絡通信,建好的工程里,請務必在 AndroidManifest.xml 加上網絡權限的許可,如下圖:
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_3.png

Android客戶端代碼實現


1客戶端主類 MainActivity.java:


/*
 * Copyright (C) 2016 即時通訊網(52im.net) - 即時通訊開發者社區.
 * All rights reserved.
 */
package net.x52im.example.android.udp;

import net.x52im.example.android.udp.utils.UDPUtils;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;

/**
 * Demo主類。
 * 
 * @author jack.jiang@52im.net, 2016-06-27
 * @version 1.0
 */
public class MainActivity extends ActionBarActivity 
{
        private final static String TAG = MainActivity.class.getSimpleName();
        // 重復發送的時間間隔(單位:毫秒)
        public static int INTERVAL = 5000;
        private Handler handler = null;
        private Runnable runnable = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                // 初始化本地UDP的Socket
                LocalUDPSocketProvider.getInstance().initSocket();
                // 啟動本地UDP監聽(接收數據用的)
                LocalUDPDataReciever.getInstance(this).startup();

                // 自動循環發送
                handler = new Handler();
                runnable = new Runnable(){
                        @Override
                        public void run()
                        {
                                sendMessageToServer();
                                
                                // 開始下一次循環
                                handler.postDelayed(runnable, INTERVAL);
                        }
                };
                
                // 立即開始發送
                handler.postDelayed(runnable, 0);
        }

        private void sendMessageToServer()
        {
                try
                {
                        // 要發送的數據
                        String toServer = "Hi,我是客戶端,我的時間戳"+System.currentTimeMillis();
                        byte[] soServerBytes = toServer.getBytes("UTF-8");
                        // 開始發送
                        boolean ok = UDPUtils.send(soServerBytes, soServerBytes.length);
                        if(ok)
                                Log.d(TAG, "發往服務端的信息已送出.");
                        else
                                Log.e(TAG, "發往服務端的信息沒有成功發出!!!");
                }
                catch (Exception e)
                {
                        Log.w(TAG, e.getMessage(), e);
                }
        }
}
補充說明:本類沒有去寫UI代碼,只是作為本次Demo的主入口類而已,需要查看數據輸出的,請在Eclipse下的DDMS控制臺看查看log輸出哦。

2客戶端本地 UDP Socket 管理類 LocalUDPSocketProvider.java:

/*
 * Copyright (C) 2016 即時通訊網(52im.net) - 即時通訊開發者社區.
 * All rights reserved.
 */
package net.x52im.example.android.udp;

import java.net.DatagramSocket;
import java.net.InetAddress;

import net.x52im.example.android.udp.utils.ConfigEntity;
import android.util.Log;

/**
 * 本地 UDP Socket 管理類。
 * 
 * @author jack.jiang@52im.net, 2016-06-27
 * @version 1.0
 */
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;
        }
}
補充說明:以上代碼使用的是Android的標準UDP Socket代碼,如果你對此不太熟悉請先查閱更多Android UDP通訊的相關實例。

3客戶端本地UDP端口監聽和數據接收類 LocalUDPDataSender.java:

/*
 * Copyright (C) 2016 即時通訊網(52im.net) - 即時通訊開發者社區.
 * All rights reserved.
 */
package net.x52im.example.android.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

import net.x52im.example.android.udp.utils.ConfigEntity;
import android.content.Context;
import android.util.Log;

/**
 * 本地UDP端口監聽和數據接收類。
 * 
 * @author jack.jiang@52im.net, 2016-06-27
 * @version 1.0
 */
public class LocalUDPDataReciever
{
        private static final String TAG = LocalUDPDataReciever.class.getSimpleName();
        private static LocalUDPDataReciever instance = null;
        private Thread thread = null;
        private Context context = null;
        
        public static LocalUDPDataReciever getInstance(Context context)
        {
                if (instance == null)
                        instance = new LocalUDPDataReciever(context);
                return instance;
        }

        private LocalUDPDataReciever(Context context)
        {
                this.context = context;
        }

        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);
                }
        }
}

服務端準備工作


本文將分別基于MINA2和Netty4實現兩套服務端(你只需要使用其中之一即可),服務端準備工作已在本系列文章的前兩篇詳細記錄了,具體如下:

- Netty4實現服務端的準備工作請見:NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示
- MINA2實現服務端的準備工作請見:NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示

服務端代碼實現


因兩套方案的服務端代碼都不復雜,且已經本系列文章的前兩篇中詳細介紹,本文就不在重復粘貼了。

- Netty4實現的服務端請見:NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示
- MINA2實現的服務端請見:NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示

Demo 運行截圖


【1】Android客戶端運行結果:
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_QQ20160627-0.png

【2】服務端運行結果(MINA2方案):
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_5.png

【3】服務端運行結果(Netty4方案):
NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_6.png

本文小結


Demo中的客戶端代碼是從開源即時通訊框架MobileIMSDK 的Android端中復制出來的(為了方便理解做了大幅簡化),有興趣的可看看 MobileIMSDK Android端Server端,簡化一下可以用作你自已的各種用途。

本文的姊妹篇《NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰》,演示的是iOS端的跨平臺UDP雙向通信,需要的話可以看看。

對于服務端的NIO框架來說,如果你閱讀過本系列的《NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示》和《NIO框架入門(二):服務端基于MINA2的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.hqkrtb.live/forum.php?mod=collection&action=view&ctid=9

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

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

完整源碼工程下載


客戶端源碼(Android版).rar (2.07 MB , 下載次數: 2941 , 售價: 2 金幣)
Java服務端源碼(Netty4實現).rar (2.87 MB , 下載次數: 158 , 售價: 2 金幣)
Java服務端源碼(MINA2實現).rar (1 MB , 下載次數: 53 , 售價: 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.hqkrtb.live/forum.php?mod=collection&op=all

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

上一篇:NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]下一篇:分享java AMR音頻文件合并源碼,全網最全

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

推薦方案
評論 16
寫的很詳細,多謝樓主,已下載!
簽名: 該會員沒有填寫今日想說內容.
樓主費心了,對新手來說,這樣的文章很適合快速上手。
簽名: 國慶長假還沒有緩過來,請讓我靜一靜,產品狗死遠點...
不錯,收藏了·
mark,寫得非常好,易懂
引用:279150469 發表于 2016-07-06 17:47
mark,寫得非常好,易懂

簽名: 明天出發去鹽城,線下面基會要開始了
非常棒 ,學習了,正是我想要的
謝謝分享!
好東西,謝謝分享
簽名: 該會員沒有填寫今日想說內容.
我看看能不能用
寫的很好,看看有沒有用處。
看看這個
學習了
樓主好,請問android的客戶端程序是否可以使用nio的DatagramChannel進行發送和接收數據?@JackJiang
引用:ken111 發表于 2018-03-17 19:09
樓主好,請問android的客戶端程序是否可以使用nio的DatagramChannel進行發送和接收數據?@JackJiang

肯定可以啊,UDP協議是標準的東西,它既不屬于Mina框架,也不屬于Netty框架。
簽名: 明天出發去鹽城,線下面基會要開始了
簽名: 不錯,好好學習
謝謝樓主分享,學習了
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
乐彩网17500