默認
打賞 發表評論 44
NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]
閱讀(55390) | 評論(44 收藏18 淘帖3 2

前言


本文將演示一個iOS客戶端程序,通過UDP協議與兩個典型的NIO框架服務端,實現跨平臺雙向通信的完整Demo。服務端將分別用MINA2和Netty4進行實現,而通信時服務端你只需選其一就行了。同時用MINA2和Netty4分別實現服務端的目的,是因為很多人都在糾結到底是用MINA還是Netty來實現高并發的Java網絡通信服務端,在此干脆兩個都實現了,就看你怎么選擇了,夠吊吧。

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

實際上,MINA2和Netty4的官方代碼里已經有UDP通信的Demo代碼,但客戶端并不是基于現今流行的移動端(主要是Android和iOS端)來實現,本文將演示用iOS客戶端來實現這種跨平臺的雙向網絡通信。演示Demo中,已經解決跨平臺通信時的亂碼、數據字節異常等問題,請繼續往下閱讀。

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

《NIO框架入門》系列文章


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

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


本文亮點


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

本文Demo的場景邏輯


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

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

iOS客戶端準備工作


1Step 1:去Github上下載最新的CocoaAsyncSocket


CocoaAsyncSocket源碼地址:https://github.com/52im/CocoaAsyncSocket,如下圖:

NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_QQ20160623-0.png

補充說明:iOS里的網絡編程有多種途徑實現(具體請參看此文),本文選擇的是iOS里非常熱門的 CocoaAsyncSocket 工程,它對iOS原生網絡API做了進一步封裝,使得開發者更易使用。

2Step 2:建好XCode工程,準備開擼


建好工程后把CocoaAsyncSocket的源碼引用進來就行了,如下圖:

NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰 [附件下載]_QQ20160623-1.png

補充說明:如何新建一個XCode工程請自行百度之,按照系統默認的簡單建立一個就好了,本例不需要作額外配置和額外的系統庫引用。

iOS客戶端代碼實現


1客戶端主類 ViewController.m:

//  Copyright (C) 2016 即時通訊網(52im.net)- 即時通訊開發者社區.
//  All rights reserved.
//  Created by JackJiang on 16/06/22.
#import "ViewController.h"
#import "LocalUDPSocketProvider.h"
#import "LocalUDPDataSender.h"
#import "CharsetHelper.h"
#import "UDPUtils.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化socket
    [[LocalUDPSocketProvider sharedInstance] initialLocalUDPSocket];
    // 注意:執行延遲的單位是秒哦
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(doSend) userInfo:nil repeats:YES];
    [timer fire];
}

- (void)doSend
{
    NSString *toServer = [NSString stringWithFormat:@"Hi,我是iOS客戶端,我的時間戳 %li",[UDPUtils getTimeStampWithMillisecond_l]];
    [[LocalUDPDataSender sharedInstance] send:[CharsetHelper getBytesWithString:toServer]];
}

@end

補充說明:本類本是界面主類,但為了省事,沒有去寫UI代碼,只是作為本次Demo的主入口類而已,需要查看數據輸出的,請在XCode控制臺看查看log輸出哦。

2客戶端Socket管理類 LocalUDPSocketProvider.m:

//  Copyright (C) 2016 即時通訊網(52im.net)- 即時通訊開發者社區.
//  All rights reserved.
//  Created by JackJiang on 16/06/22.
#import "LocalUDPSocketProvider.h"
#import "GCDAsyncUdpSocket.h"
#import "ConfigEntity.h"
#import "CompletionDefine.h"

@interface LocalUDPSocketProvider ()
@property (nonatomic, retain) GCDAsyncUdpSocket *localUDPSocket;
@property (nonatomic, copy) ConnectionCompletion connectionCompletionOnce_;
@end

@implementation LocalUDPSocketProvider

// 本類的單例對象
static LocalUDPSocketProvider *instance = nil;

+ (LocalUDPSocketProvider *)sharedInstance
{
    if (instance == nil)
        instance = [[super allocWithZone:NULL] init];
    return instance;
}

- (GCDAsyncUdpSocket *)initialLocalUDPSocket
{
    NSLog(@"【IMCORE】new GCDAsyncUdpSocket中...");
    
    // ** Setup our socket.
    self.localUDPSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    
    // ** START udp socket
    // 本地綁定端口合法性檢查
    int port = [ConfigEntity getLocalUdpSendAndListeningPort];
    if (port < 0 || port > 65535)
        port = 0;
    NSError *error = nil;
    // 綁定到指定端口(以便收發數據)
    if (![self.localUDPSocket bindToPort:port error:&error])
    {
        NSLog(@"【IMCORE】localUDPSocket創建時出錯,原因是 bindToPort: %@", error);
        return nil;
    }
    // 開啟收數據處理
    if (![self.localUDPSocket beginReceiving:&error])
    {
        NSLog(@"【IMCORE】localUDPSocket創建時出錯,原因是 beginReceiving: %@", error);
        return nil;
    }
    NSLog(@"【IMCORE】localUDPSocket創建已成功完成.");
    return self.localUDPSocket;
}
。。。。。。

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    if (msg)
        NSLog(@"【UDP_SOCKET】【NOTE】>>>>>> 收到服務端的消息: %@", msg);
    else
    {
        NSString *host = nil;
        uint16_t port = 0;
        [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
        NSLog(@"【UDP_SOCKET】RECV: Unknown message from: %@:%hu", host, port);
    }
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address
{
    NSLog(@"【UDP_SOCKET】成收到的了UDP的connect反饋, isCOnnected?%d", [sock isConnected]);
    // 連接結果回調
    if(self.connectionCompletionOnce_ != nil)
        self.connectionCompletionOnce_(YES);
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError *)error
{
    NSLog(@"【UDP_SOCKET】成收到的了UDP的connect反饋,但連接沒有成功, isCOnnected?%d", [sock isConnected]);
    // 連接結果回調
    if(self.connectionCompletionOnce_ != nil)
        self.connectionCompletionOnce_(NO);
}

@end

補充說明:因代碼較多,文中沒有列出該類的所有代碼,請前往文末下載完整XCode工程自行查看哦。

3數據發送實現類 LocalUDPDataSender.m:

//  Copyright (C) 2016 即時通訊網(52im.net)- 即時通訊開發者社區.
//  All rights reserved.
//  Created by JackJiang on 16/06/22.
#import "LocalUDPDataSender.h"
#import "CharsetHelper.h"
#import "GCDAsyncUdpSocket.h"
#import "LocalUDPSocketProvider.h"
#import "ConfigEntity.h"
#import "UDPUtils.h"
#import "CompletionDefine.h"

@implementation LocalUDPDataSender

// 本類的單例對象
static LocalUDPDataSender *instance = nil;

- (BOOL) send:(NSData *)dataWithBytes
{
    // 獲得UDPSocket實例
    GCDAsyncUdpSocket *ds = [[LocalUDPSocketProvider sharedInstance] getLocalUDPSocket];
    // 確保發送數據開始前,已經進行connect的操作:如果Socket沒有“連接”上服務端,嘗試“連接”一次
    if(ds != nil && ![ds isConnected])
    {
        // 此次數據只在“連接”成功后發出,“連接”成功則會調用此回調block代碼
        ConnectionCompletion observerBlock = ^(BOOL connectResult) {
            // 成功建立了UDP連接后就把包發出去
            if(connectResult)
                [UDPUtils sendImpl:ds withData:dataWithBytes];
        };
        // 調置連接回調
        [[LocalUDPSocketProvider sharedInstance] setConnectionObserver:observerBlock];
        
        NSError *connectError = nil;
        BOOL connectResult = [[LocalUDPSocketProvider sharedInstance] tryConnectToHost:&connectError withSocket:ds completion:observerBlock];
        // 如果連接意圖沒有成功發出則返回錯誤碼
        return connectResult;
    }
    else
        return [UDPUtils sendImpl:ds withData:dataWithBytes];
}

// 獲取本類的單例。使用單例訪問本類的所有資源是唯一的合法途徑。
+ (LocalUDPDataSender *)sharedInstance
{
    if (instance == nil)
        instance = [[super allocWithZone:NULL] init];
    return instance;
}

@end

服務端準備工作


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

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

服務端代碼實現


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

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

Demo 運行行截圖


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

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

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

本文小結


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

如果你閱讀過本系列的《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.emxvra.tw/forum.php?mod=collection&action=view&ctid=9

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

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

完整源碼工程下載


客戶端源碼(iOS版).zip (85.88 KB , 下載次數: 130 , 售價: 2 金幣)
Java服務端源碼(MINA2實現)..rar (1021.99 KB , 下載次數: 28 , 售價: 2 金幣)
Java服務端源碼(Netty4實現).rar (2.87 MB , 下載次數: 42 , 售價: 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

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

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

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

推薦方案
評論 44
netty4版的服務端呢
簽名: 星期六,那又怎樣,還是得上班
今天網絡不好,晚點再把netty4的服務端工程傳上來
簽名: 《網易云信技術分享:IM中的萬人群聊技術方案實踐總結》http://www.emxvra.tw/thread-2707-1-1.html
棒棒噠
簽名: 好想把妹!
很牛,全都收藏了·
學習了
怎么下載不來哦
引用:719967870 發表于 2016-07-25 17:14
怎么下載不來哦

積分不夠?
簽名: 《網易云信技術分享:IM中的萬人群聊技術方案實踐總結》http://www.emxvra.tw/thread-2707-1-1.html
站長很熱心
辛苦了,適合我這種彩筆
引用:wyd1610712520 發表于 2016-10-11 09:54
辛苦了,適合我這種彩筆

我就欣賞你這么直白。。。
簽名: 《網易云信技術分享:IM中的萬人群聊技術方案實踐總結》http://www.emxvra.tw/thread-2707-1-1.html
辛苦了,看得出很辛苦整理的資料.基本都很齊全.
謝謝分享。
樓主,幫忙看下,接受不到服務器的反饋消息
2017-02-06 14:23:56.609 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】tag為0的NSData已成功發出.
2017-02-06 14:24:06.607 ios_echo_client_udp[4455:446907] 【IMCORE】localUDPSocket嘗試發出連接到目標主機192.168.1.9:15820的動作成功了.(此前isConnected?0)
2017-02-06 14:24:06.608 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】成收到的了UDP的connect反饋, isCOnnected?1
2017-02-06 14:24:06.609 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】tag為0的NSData已成功發出.
2017-02-06 14:24:16.607 ios_echo_client_udp[4455:446907] 【IMCORE】localUDPSocket嘗試發出連接到目標主機192.168.1.9:15820的動作成功了.(此前isConnected?0)
2017-02-06 14:24:16.608 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】成收到的了UDP的connect反饋, isCOnnected?1
2017-02-06 14:24:16.609 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】tag為0的NSData已成功發出.
引用:zenghl 發表于 2017-02-06 14:24
2017-02-06 14:23:56.609 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】tag為0的NSData已成功發出.
20 ...

這只有客戶端的log,不能說明什么問題。

建議你先保證手機和服務器的網段能正常進行網絡通信,方法如下:
先確定你的手機是否能與服務端所在的電腦雙向通信,即在手機端ping電腦、在電腦端ping手機(手機的ip可以通過網絡設置里查看的到)。
簽名: 《網易云信技術分享:IM中的萬人群聊技術方案實踐總結》http://www.emxvra.tw/thread-2707-1-1.html
謝謝分享
樓主非常棒,學習了,膜拜一下
簽名: 該會員沒有填寫今日想說內容.
引用:zenghl 發表于 2017-02-06 14:24
2017-02-06 14:23:56.609 ios_echo_client_udp[4455:446907] 【UDP_SOCKET】tag為0的NSData已成功發出.
20 ...

#import "ConfigEntity.h"

// 服務端ip地址(或域名)
static NSString *serverIp = @"192.168.0.107";

上面這個地址改成你電腦的IP地址就可以了,我也碰到了這個問題。

簽名: 該會員沒有填寫今日想說內容.
引用:ashura12342000 發表于 2017-05-02 20:41
#import "ConfigEntity.h"

// 服務端ip地址(或域名)

這都沒注意到啊,計算機網絡老師已哭暈在廁所
簽名: 《網易云信技術分享:IM中的萬人群聊技術方案實踐總結》http://www.emxvra.tw/thread-2707-1-1.html
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
777彩票走势图表