使用AsyncSocket進(jìn)行socket編程

智能冲秽,這個(gè)名詞越來(lái)越多的被應(yīng)用到生活中。智能手機(jī)矩父、智能電視劳跃、智能手表。浙垫。刨仑。電視有電視遙控器郑诺,空調(diào)有空調(diào)遙控器,按摩器有按摩器遙控器杉武。辙诞。。各種產(chǎn)品都有各自的一套遙控管理系統(tǒng)。《人生遙控器》中的邁可·紐曼在各種遙控器中總也找不到正確的遙控器硫豆,渴望有一個(gè)萬(wàn)能遙控器橙依。在現(xiàn)實(shí)生活中是否也能有這樣的遙控器呢臣樱,怎么實(shí)現(xiàn)呢?

我們生活中用到的最多的智能產(chǎn)品應(yīng)該是手機(jī)了,把手機(jī)和其它智能產(chǎn)品聯(lián)系起來(lái)是個(gè)不錯(cuò)的選擇。那么怎么實(shí)現(xiàn)呢梁呈?有2種方式供選擇,一個(gè)是藍(lán)牙蘸秘,一個(gè)是建立socket連接官卡。今天我們討論的是建立socket連接。

案例:利用手機(jī)對(duì)電視進(jìn)行遙控

? ? **實(shí)現(xiàn)方案:1.在電視端搭建sever醋虏;2.在手機(jī)端搭建client寻咒;3.手機(jī)端發(fā)送UDP廣播;4.電視端收到廣播后回包颈嚼,回包信息包括TCP端口和其它配置信息毛秘;5.手機(jī)端通過(guò)服務(wù)端回包中的端口號(hào)向服務(wù)端發(fā)起TCP連接;6.發(fā)送指令阻课,實(shí)現(xiàn)對(duì)電視的遙控熔脂。

? ? **開(kāi)發(fā)工具:Xcode9.2

? ? **框架:GCDAsyncSocket框架,下載地址:https://github.com/robbiehanson/CocoaAsyncSocket柑肴,下載后資源文件路徑:../Source/GCD,把GCD文件夾下的GCDAsyncSocket.h旬薯、GCDAsyncSocket.m晰骑、GCDAsyncUdpSocket.h、GCDAsyncUdpSocket.m 這4個(gè)文件拖入項(xiàng)目中绊序。其中GCDAsyncSocket是對(duì)TCP套接字的封裝硕舆,GCDAsyncUdpSocket是對(duì)UDP套接字的封裝。

具體實(shí)現(xiàn):

UDP

一骤公、UDP服務(wù)端

? ? 1.監(jiān)聽(tīng)端口:

- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr;

????2.代理方法:

// 當(dāng)收到UDP包時(shí)抚官,會(huì)調(diào)用這個(gè)方法

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext;

// 成功發(fā)送UDP包時(shí)調(diào)用的方法阶捆,服務(wù)端和客戶(hù)端通用

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag;

// 發(fā)送UDP包失敗時(shí)調(diào)用的方法凌节,服務(wù)端和客戶(hù)端通用

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error;

// 連接斷了之后調(diào)用的方法钦听,服務(wù)端和客戶(hù)端通用

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError *)error;

????3.向客服端發(fā)送回包:

// 服務(wù)端和客戶(hù)端通用

- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag;

二、UDP客戶(hù)端

? ? 1.發(fā)送廣播:

? ? ? ? -- host :不知道IP時(shí)傳廣播地址:255.255.255.255

- (void)sendData:(NSData *)data toHost:(NSString *)host port:(uint16_t)port withTimeout:(NSTimeInterval)timeout tag:(long)tag;

? ? 2.代理方法同上倍奢。

三朴上、TCP服務(wù)端

? ? 1.監(jiān)聽(tīng)端口:

// 返回值為 YES 時(shí)表示監(jiān)聽(tīng)成功,并不代表成功與客戶(hù)端建立連接

- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr;

? ? 2.代理方法:

// 與客戶(hù)端成功建立連接后調(diào)用此方法卒煞。

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;

// 收到消息時(shí)調(diào)用痪宰,服務(wù)端和客服端通用

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

四、TCP客戶(hù)端

? ? 1.連接服務(wù)端:

//?timeout 傳-1表示不設(shè)置超時(shí)限制畔裕,如果需要設(shè)置傳其它非負(fù)正整數(shù)值衣撬,??返回 YES 不表示已經(jīng)與服務(wù)端連接成功

- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port ?withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;

? ? **2.連接成功后,開(kāi)始接收數(shù)據(jù):

// 在收到連接成功的代理方法調(diào)用該方法扮饶。

- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;

????3.發(fā)送數(shù)據(jù):

- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

? ? 4.斷開(kāi)連接:

- (void)disconnect;

????5.代理方法:

// 與服務(wù)端連接成功具练,在這個(gè)方法中調(diào)用 **2 中提到的方法

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;

// 發(fā)送數(shù)據(jù)成功后調(diào)用的方法贴届,服務(wù)端和客戶(hù)端通用

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;

// 連接失敗時(shí)調(diào)用該方法

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;


以上是GCDAsyncSocket框架建立socket連接的最基本的方法靠粪,詳情可參照Demo, 密碼:xjl0。


小彩蛋:

1. int 轉(zhuǎn) byte

// ?有高位和地位之分毫蚓,如果不符合需求占键,把0-4位的位移按倒序?qū)懠纯伞?/p>

????NSInteger Id = 10; ? ?

????Byte bytes[4];

????bytes[0] = (Byte)(Id);

? ? bytes[1] = (Byte)(Id>>8);

????bytes[2] = (Byte)(Id>>16);

????bytes[3] = (Byte)(Id>>24);

2.拼接 Byte 和 NSData?

// 把 Byte 轉(zhuǎn)換成 NSData,再用NSMutableData 拼接元潘∨弦遥或按照下面代碼的方式,直接發(fā)byte 轉(zhuǎn)成?NSMutableData 翩概,再拼接 data牲距。

NSMutableData *newData = [[NSMutableData alloc] initWithBytes:bytes length:sizeof(bytes)];

?[newData appendData:data];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钥庇,隨后出現(xiàn)的幾起案子牍鞠,更是在濱河造成了極大的恐慌,老刑警劉巖评姨,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件难述,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吐句,警方通過(guò)查閱死者的電腦和手機(jī)胁后,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗦枢,“玉大人攀芯,你說(shuō)我怎么就攤上這事∥穆玻” “怎么了侣诺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵殖演,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我紧武,道長(zhǎng)剃氧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任阻星,我火速辦了婚禮朋鞍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妥箕。我一直安慰自己滥酥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布畦幢。 她就那樣靜靜地躺著坎吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宇葱。 梳的紋絲不亂的頭發(fā)上瘦真,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音黍瞧,去河邊找鬼诸尽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛印颤,可吹牛的內(nèi)容都是我干的您机。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼年局,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼际看!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起矢否,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仲闽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后僵朗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赖欣,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年衣迷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酱酬。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壶谒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膳沽,到底是詐尸還是另有隱情汗菜,我是刑警寧澤让禀,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站陨界,受9級(jí)特大地震影響巡揍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菌瘪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一腮敌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俏扩,春花似錦糜工、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嫉戚,卻和暖如春刨裆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彬檀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工帆啃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凤覆。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓链瓦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盯桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慈俯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348