Socket 簡(jiǎn)介
Socket 是一種面向C/S的的模型挨约,客戶(hù)端可以根據(jù)服務(wù)端所給出的IP和端口號(hào)進(jìn)行與服務(wù)器通迅噩凹。
我們平時(shí)上網(wǎng)的時(shí)候曹锨,在地址欄輸入的網(wǎng)頁(yè)地址临扮,其實(shí)就是IP加端口號(hào)的另一種表現(xiàn)形式论矾。DNS服務(wù)器會(huì)根據(jù)你地址欄上的輸入,解析出域名杆勇,再將域名轉(zhuǎn)換成為IP和端口號(hào)的組合贪壳,然后對(duì)服務(wù)器進(jìn)行訪問(wèn)。
而我們平時(shí)所說(shuō)的“智能家居”蚜退,你可以將他視為一個(gè)小型的服務(wù)器闰靴,當(dāng)你在公司進(jìn)行iOS客戶(hù)端的開(kāi)發(fā)時(shí),公司會(huì)給你提供一份開(kāi)發(fā)文檔钻注,里面會(huì)包含有IP和端口號(hào)蚂且。你根據(jù)所給出的IP與端口號(hào),將一些指定的數(shù)據(jù)發(fā)送到智能電器幅恋,就可以讓服務(wù)器根據(jù)你的指令進(jìn)行一系列的操作(如:智能空調(diào)的開(kāi)膘掰、關(guān)、溫度調(diào)節(jié),智能打印機(jī)的打印等)识埋。
Socket 的使用
Socket 的開(kāi)發(fā)說(shuō)白了也很簡(jiǎn)單凡伊,主要分為四步:
1、建立 Socket 對(duì)象窒舟;
2系忙、手機(jī)端與實(shí)物(智能電器)的 Socket 連接;
3惠豺、手機(jī)端與實(shí)物的用 Socket 進(jìn)行數(shù)據(jù)傳輸(數(shù)據(jù)的接收與發(fā)送);
4银还、手機(jī)端與實(shí)物斷開(kāi) Socket 連接;
這里我來(lái)教大家怎么使用 CocoaAsyncSocket 這個(gè)第三方框架中的 GCDAsyncSocket.h 來(lái)幫助我們實(shí)現(xiàn)符合TCP/IP協(xié)議的 Socket
一、建立 Socket 對(duì)象
創(chuàng)建 Socket 實(shí)列
{
GCDAsyncSocket *socket;
}
初始化 Socket洁墙,指定代理調(diào)用隊(duì)列
socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
二蛹疯、Socket 連接
NSError *err;
NSString *ip = @"你的開(kāi)發(fā)文檔上的IP";
int port = 你開(kāi)發(fā)文檔上的PORT;
[socket connectToHost:ip onPort:port onPort:port withTimeout:10.f error:&err];
連接成功調(diào)用代理
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
}
連接失敗(斷開(kāi) Socket 連接)調(diào)用代理
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
}
三热监、Socket 數(shù)據(jù)傳輸
1)寫(xiě)數(shù)據(jù):
NSData *data = 你要發(fā)送的數(shù)據(jù)(一般會(huì)有一定的數(shù)據(jù)格式捺弦,公司所定的開(kāi)發(fā)文檔中會(huì)有該格式的說(shuō)明)
[socket writeData:data withTimeout:5.f tag:tag];
2)讀數(shù)據(jù):
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
// 在寫(xiě)完數(shù)據(jù)時(shí)開(kāi)啟讀數(shù)據(jù)監(jiān)聽(tīng),否則會(huì)讀不到數(shù)據(jù)
[socket readDataWithTimeout:10.f tag:tag];
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
// 這是一個(gè)代理方法孝扛,讀到一條服務(wù)器返回的數(shù)據(jù)就會(huì)調(diào)用一次列吼,tag為開(kāi)啟監(jiān)聽(tīng)時(shí)的tag
}
四、斷開(kāi) Socket 連接
[socket disconnect];