日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS开发基础之socket的使用

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS开发基础之socket的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IOS開發基礎之socket的使用

socket是純C語言的,跨平臺的

第一章:

  • socket 的演示
// ViewController.m // 29-socket演示 // Created by 魯軍 on 2021/3/9. #import "ViewController.h" #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> @interface ViewController () @end @implementation ViewController /*lujun@lujundeMac ~ % nc -lk 12345終端模擬一個虛擬你服務器**/ - (void)viewDidLoad {[super viewDidLoad];//1 創建Socket//第一個參數domain 協議簇 指定IPV4//第二個參數 type socket的類型 流式socket 數據報 socket//第三個參數protocol 協議//返回值 如果創建成功返回的是socket的描述符 失敗 -1int clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//2連接服務器//第一個參數 socket 的描述符//第二個參數 結構體 ip地址和端口//第三個參數 結構體的長度 sizeof//返回值 成功0 失敗 非 0struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port=htons(12345);int result = connect(clientSocket,(const struct sockaddr *) &addr, sizeof(addr));////if(result==0){// NSLog(@"成功");//}else{//NSLog(@"失敗");//}if(result !=0){NSLog(@"失敗");return;}//3想服務器發送數據//成功則返回實際傳送出去的字符數 失敗返回 -1const char *msg = "Hello World";//strlen(msg) 字符數 不是字節數ssize_t sendCount = send(clientSocket,msg, strlen(msg),0);NSLog(@"發送的字節數 %zd",sendCount);//4 接收服務器的返回的數據//返回的是實際接收的字節個數uint8_t buffer[1024];ssize_t recvCount = recv(clientSocket,buffer, sizeof(buffer),0);NSLog(@"接收的字節數 %zd",recvCount);NSData *data = [NSData dataWithBytes:buffer length:recvCount];NSString *recvMsg = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];NSLog(@"收到的的信息 %@",recvMsg);// 5 關閉連接close(clientSocket); } @end

第二章

  • 30-聊天室Socket
// ViewController.m // 30-聊天室Socket // Created by 魯軍 on 2021/3/8. #import "ViewController.h" #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *portView; @property (weak, nonatomic) IBOutlet UITextField *ipView; @property (weak, nonatomic) IBOutlet UITextField *sendMsgView; @property (weak, nonatomic) IBOutlet UILabel *recvMsgView; @property(nonatomic,assign) int clientSocket; @end @implementation ViewController /*$ lujun@lujundeMac IOSThreadNetwork % nc -lk 12345**/ //連接服務器 - (IBAction)connectClick:(id)sender {[self connect:self.ipView.text port:[self.portView.text intValue]]; }//點擊發送按鈕 - (IBAction)sendClick:(id)sender {self.recvMsgView.text = [self sendAndRecv:self.sendMsgView.text]; } - (IBAction)closeClick:(id)sender {close(self.clientSocket);NSLog(@"關閉連接"); } - (void)viewDidLoad {[super viewDidLoad]; } -(NSString *)sendAndRecv:(NSString *)sendMsg{//3想服務器發送數據//成功則返回實際傳送出去的字符數 失敗返回 -1const char *msg = sendMsg.UTF8String; //OC轉C 語言的字符串//strlen(msg) 字符數 不是字節數ssize_t sendCount = send(self.clientSocket,msg, strlen(msg),0);NSLog(@"發送的字節數 %zd",sendCount);//4 接收服務器的返回的數據//返回的是實際接收的字節個數uint8_t buffer[1024];ssize_t recvCount = recv(self.clientSocket,buffer, sizeof(buffer),0);NSLog(@"接收的字節數 %zd",recvCount);NSData *data = [NSData dataWithBytes:buffer length:recvCount];NSString *recvMsg = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];NSLog(@"收到的的信息 %@",recvMsg);return recvMsg; } -(BOOL)connect:(NSString *)ip port:(int)port{int clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);self.clientSocket = clientSocket;struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(ip.UTF8String); //oc字符串轉c語言的字符串addr.sin_port=htons(port);int result = connect(self.clientSocket,(const struct sockaddr *) &addr, sizeof(addr));if(result ==0){return YES;}else{return NO;}} @end

info.plist加入ATS

<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>

第三章

  • 使用Socket請求百度
// // ViewController.m // 31-使用Socket請求百度 // // Created by 魯軍 on 2021/3/8. //#import "ViewController.h" #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> @interface ViewController () @property (weak, nonatomic) IBOutlet UIWebView *webView; @property(nonatomic,assign) int clientSocket; @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//1.連接百度的服務器//36.152.44.96//直接ping www.baidu.com 可以看到 百度的IP地址BOOL result = [self connect:@"36.152.44.96" port:80];if(!result){NSLog(@"連接失敗");return;}NSLog(@"連接成功");//構造http請求頭/* NSString *request = @"GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n""User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1\r\n""Connection: close\r\n\r\n";*/NSString *request = @"GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n""Connection: close\r\n\r\n";//http/1.0 短連接 當響應結束后連接會立即斷開//http/1.1 長連接 當響應結束后 連接會等待非常短的時間 如果這個時間內沒有新的請求 就斷開連接//服務器響應頭NSString *response = [self sendAndRecv:request];//關閉連接close(self.clientSocket);NSLog(@"%@",response);//截取響應頭 響應頭的結束標志 \r\n\r\nNSRange range = [response rangeOfString:@"\r\n\r\n"];NSString *html = [response substringFromIndex:range.length + range.location];[self.webView loadHTMLString:html baseURL:nil];[self.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.baidu.com"]]; }-(NSString *)sendAndRecv:(NSString *)sendMsg{//3想服務器發送數據//成功則返回實際傳送出去的字符數 失敗返回 -1const char *msg = sendMsg.UTF8String; //OC轉C 語言的字符串//strlen(msg) 字符數 不是字節數ssize_t sendCount = send(self.clientSocket,msg, strlen(msg),0);NSLog(@"發送的字節數 %zd",sendCount);//4 接收服務器的返回的數據//返回的是實際接收的字節個數uint8_t buffer[1024];NSMutableData *mData = [NSMutableData data];ssize_t recvCount = recv(self.clientSocket,buffer, sizeof(buffer),0);[mData appendBytes:buffer length:recvCount];//服務器會返回多次數據 等所有數據都接收完成 再轉換成字符串while(recvCount !=0){recvCount = recv(self.clientSocket,buffer, sizeof(buffer),0);NSLog(@"接收的字節數 %zd",recvCount);[mData appendBytes:buffer length:recvCount];}//把字節數組轉換成oc字符串NSString *recvMsg = [[NSString alloc] initWithData:mData.copy encoding:NSUTF8StringEncoding];return recvMsg; } -(BOOL)connect:(NSString *)ip port:(int)port{int clientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);self.clientSocket = clientSocket;struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(ip.UTF8String); //oc字符串轉c語言的字符串addr.sin_port=htons(port);int result = connect(self.clientSocket,(const struct sockaddr *) &addr, sizeof(addr));if(result ==0){return YES;}else{return NO;} } @end

總結

以上是生活随笔為你收集整理的IOS开发基础之socket的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。