socket初级使用(客户端)
生活随笔
收集整理的這篇文章主要介紹了
socket初级使用(客户端)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在國慶這段時間里用零星的一些時間看了一下socket的學習資料,由于筆者偏向學習實用方面的內容,因此此篇文章涉及理論知識較少,主要是以實現思路(怎么做)為主,但在實現之前還是需要了解一些基礎的理論知識(如果其中有誤請指出)
TCP是用socket來實現,或者說socket就是對TCP的封裝,因此要想明白Socket連接,先要明白TCP連接。
TCP(傳輸控制協議)(對應TCP的另一種協議是UDP協議,讀者可自行查閱相關資料)
作用:建立連接,形成傳輸數據的通道
特點:在連接中進行大數據傳輸(數據大小不收限制)
優點:通過三次握手完成連接,是可靠協議,安全送達(關于三次握手可以用打電話的例子說明)
劣勢:必須建立連接,效率會稍低 通過此圖可以看出通信的兩端都是Socket,因此網絡通信其實就是Socket間的通信,數據在兩個Socket間通過IO傳輸。 這里不做服務端介紹,主要介紹客戶端的實現,以下為實現代碼及說明 /**主要實現思路* 1.創建主機地址,設置端口號2.連接到主機3.將c語言輸入輸出流轉化為oc語言并代理4.打開輸入輸出流,并加入消息循環池
最后個根據代理方法來監聽輸入輸出流的變化即可 *///設置主機地址和端口號根據服務端所給端口號設置NSString *host = @"127.0.0.1";int port = 12345;//創建c語言輸入輸出流 CFReadStreamRef readStream;CFWriteStreamRef writeStream;//鏈接至主機CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);//將c語言輸入輸出流轉化為oc對象,此處用到定義好的OC全局變量_outputStream = (__bridge NSOutputStream *)writeStream;_inputStream = (__bridge NSInputStream *)readStream;//設置代理_outputStream.delegate = self;_inputStream.delegate = self;//打開輸入輸出流通道并監聽 [_outputStream open];[_inputStream open];//加入消息循環池,若不放入消息循環池不能做到監聽 [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
接下來實現輸入輸出流的代理方法讓我們可以實時監聽輸入輸出流的改變
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {switch (eventCode) {case NSStreamEventOpenCompleted: // NSLog(@"%@",[aStream class]);NSLog(@"連接到主機完成");break;case NSStreamEventHasBytesAvailable: // NSLog(@"%@",[aStream class]);NSLog(@"有字節可讀");//讀取對應的字節[self readData];break;case NSStreamEventHasSpaceAvailable:NSLog(@"%@",[aStream class]);NSLog(@"可發送字節");break;case NSStreamEventErrorOccurred:NSLog(@"鏈接錯誤");break;case NSStreamEventEndEncountered:NSLog(@"斷開鏈接");//鏈接斷開后需要關閉輸出輸出流通道并將其移出消息循環池 [_outputStream close];[_inputStream close];[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];break;default:break;} }
?對應的就有輸出數據和輸入數據
//輸出數據,此處name需要匹配服務器端輸入格式要求NSString *name = [@"iam:" stringByAppendingString:@"lisi"];//做出對應的轉化 NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding];//將數據輸出 [_outputStream write:data.bytes maxLength:data.length];//有輸出后輸入端會監聽到接收了新的數據此處就可以直接讀取 - (void)readData {//設置一個字符數組用于接收字符數據uint8_t buff[1024];//獲取字符數據并得到其長度NSUInteger length = [_inputStream read:buff maxLength:sizeof(buff)];//將接收的字符數組轉化為OC對象NSString *receving = [[NSString alloc] initWithBytes:buff length:length encoding:NSUTF8StringEncoding];NSLog(@"%@",receving); }從上述代碼中可以看出socket的使用方法其實還是較為簡單,關鍵是需要理解到其實現步驟,只要記住了步驟再做出對應的轉化就能很好的實現,當然此處只是最簡單的socket編程。希望此文對各位有幫助,最后祝大家國慶快樂!
轉載于:https://www.cnblogs.com/purple-sweet-pottoes/p/4856955.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的socket初级使用(客户端)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到龙头棺材是什么意思
- 下一篇: 有关Botton的用法(二)