Socket 簡介
Socket 是一種面向C/S的的模型,客戶端可以根據服務端所給出的IP和端口號進行與服務器通迅。
我們平時上網的時候,在地址欄輸入的網頁地址,其實就是IP加端口號的另一種表現形式。DNS服務器會根據你地址欄上的輸入,解析出域名,再將域名轉換成為IP和端口號的組合,然后對服務器進行訪問。
而我們平時所說的“智能家居”,你可以將他視為一個小型的服務器,當你在公司進行iOS客戶端的開發時,公司會給你提供一份開發文檔,里面會包含有IP和端口號。你根據所給出的IP與端口號,將一些指定的數據發送到智能電器,就可以讓服務器根據你的指令進行一系列的操作(如:智能空調的開、關、溫度調節,智能打印機的打印等)。
Socket 的使用
Socket 的開發說白了也很簡單,主要分為四步:
1、建立 Socket 對象;
2、手機端與實物(智能電器)的 Socket 連接;
3、手機端與實物的用 Socket 進行數據傳輸(數據的接收與發送);
4、手機端與實物斷開 Socket 連接;
這里我來教大家怎么使用 CocoaAsyncSocket 這個第三方框架中的 GCDAsyncSocket.h 來幫助我們實現符合TCP/IP協議的 Socket
一、建立 Socket 對象
創建 Socket 實列
{
GCDAsyncSocket *socket;
}
初始化 Socket,指定代理調用隊列
socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
二、Socket 連接
NSError *err;
NSString *ip = @"你的開發文檔上的IP";
int port = 你開發文檔上的PORT;
[socket connectToHost:ip onPort:port onPort:port withTimeout:10.f error:&err];
連接成功調用代理
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
}
連接失敗(斷開 Socket 連接)調用代理
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
}
三、Socket 數據傳輸
1)寫數據:
NSData *data = 你要發送的數據(一般會有一定的數據格式,公司所定的開發文檔中會有該格式的說明)
[socket writeData:data withTimeout:5.f tag:tag];
2)讀數據:
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
// 在寫完數據時開啟讀數據監聽,否則會讀不到數據
[socket readDataWithTimeout:10.f tag:tag];
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
// 這是一個代理方法,讀到一條服務器返回的數據就會調用一次,tag為開啟監聽時的tag
}
四、斷開 Socket 連接
[socket disconnect];