本文將演示1個(gè)iOS客戶端程序,通過UDP協(xié)議與兩個(gè)典型的NIO框架服務(wù)端,實(shí)現(xiàn)跨平臺雙向通訊的完全Demo。服務(wù)端將分別用MINA2和Netty4進(jìn)行實(shí)現(xiàn),而通訊時(shí)服務(wù)端你只需選其1就好了。同時(shí)用MINA2和Netty4分別實(shí)現(xiàn)服務(wù)真?zhèn)€目的,是由于很多人都在糾結(jié)究竟是用MINA還是Netty來實(shí)現(xiàn)高并發(fā)的Java網(wǎng)絡(luò)通訊服務(wù)端,在此干脆兩個(gè)都實(shí)現(xiàn)了,就看你怎樣選擇了,夠吊吧。
NIO框架的流行,使得開發(fā)大并發(fā)、高性能的互聯(lián)網(wǎng)服務(wù)端成為可能。這其中最流行的不過就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已被取消開發(fā)了:詳見此文),本次將使用MINA2和Netty4來實(shí)現(xiàn)服務(wù)真?zhèn)€代碼。
實(shí)際上,MINA2和Netty4的官方代碼里已有UDP通訊的Demo代碼,但客戶端其實(shí)不是基于當(dāng)今流行的移動端(主要是Android和iOS端)來實(shí)現(xiàn),本文將演示用iOS客戶端來實(shí)現(xiàn)這類跨平臺的雙向網(wǎng)絡(luò)通訊。演示Demo中,已解決跨平臺通訊時(shí)的亂碼、數(shù)據(jù)字節(jié)異常等問題,請繼續(xù)往下瀏覽。
有關(guān)MINA和Netty的入門文章很多,但多數(shù)都是復(fù)制、粘貼的未經(jīng)證實(shí)的來路不明內(nèi)容,對初次接觸的人來講,1個(gè)可以運(yùn)行且編碼規(guī)范的Demo,明顯要比各種“詳解”、“深入分析”之類的要來的直接和成心義。本系列入門文章正是基于此種斟酌而寫,雖無精深內(nèi)容,但最少希望對初次接觸MINA、Netty的人有所啟發(fā),起到拋磚引玉的作用。
本文是《NIO框架入門》系列文章中的第3篇,目錄以下:
本文要演示的Demo包括兩部份,iOS UDP客戶端和NIO框架實(shí)現(xiàn)的服務(wù)端(包括MINA2和Netty4實(shí)現(xiàn)兩個(gè)方案),客戶端每隔5秒向服務(wù)端發(fā)送消息,而服務(wù)端在收到消息后馬上回復(fù)1條消息給客戶端。
如上所述,服務(wù)端和客戶端都要實(shí)現(xiàn)消息的發(fā)送和接收,即實(shí)現(xiàn)跨平臺的雙向通訊。如果有心的話,略加改造,也就很容易實(shí)現(xiàn)1個(gè)簡陋的聊天程序了。下節(jié)將將給出真實(shí)的實(shí)現(xiàn)代碼。
CocoaAsyncSocket源碼地址:https://github.com/52im/CocoaAsyncSocket,以下圖:
補(bǔ)充說明:iOS里的網(wǎng)絡(luò)編程有多種途徑實(shí)現(xiàn)(具體請參看此文),本文選擇的是iOS里非常熱門的 CocoaAsyncSocket 工程,它對iOS原生網(wǎng)絡(luò)API做了進(jìn)1步封裝,使得開發(fā)者更容易使用。
建好工程后把CocoaAsyncSocket的源碼援用進(jìn)來就好了,以下圖:
補(bǔ)充說明:如何新建1個(gè)XCode工程請自行百度之,依照系統(tǒng)默許的簡單建立1個(gè)就行了,本例不需要作額外配置和額外的系統(tǒng)庫援用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
//
Copyright (C) 2016 即時(shí)通訊網(wǎng)(52im.net)- 即時(shí)通訊開發(fā)者社區(qū). //
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]; |