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的使用相关推荐

  1. iOS开发基础知识--碎片44

    iOS开发基础知识--碎片44  iOS开发基础知识--碎片44 1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = ...

  2. iOS开发基础-九宫格坐标(4)

    对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...

  3. IOS开发基础之OC的Block入门_Day09-Block

    IOS开发基础之OC的Block入门_Day09-Block block是oc的重要的基础知识,重点之重.跟协议一样重要,是进行函数回调重要手段.在后续的UI学习具有举足轻重的地位.学会基础的bloc ...

  4. IOS开发基础之音频工具类封装AVAudioPlayer

    IOS开发基础之音频工具类封装AVAudioPlayer 源码在我的主页下面 ,项目名称是AVAudioPlayer 关键性代码 工具类的封装 // // LJAudioTool.h // AVAud ...

  5. IOS开发基础之微博项目第1天-OC版

    IOS开发基础之微博项目第1天-OC版 纯代码创建的项目,具有参考价值 该资料来自2014年7月3号,虽然时间过去较长,但是oc和swift不同,oc语法迭代更新慢 具有一定的参考意义 涉及xib加载 ...

  6. IOS开发基础之网易新闻UICollectionView的使用第3天

    IOS开发基础之网易新闻UICollectionView的使用第3天 由于第3天的UICollectionView 并不实现,我查阅相关资料,也没解决,先从本地的plist加载的数据,不是网络的上的数 ...

  7. IOS开发基础之网易新闻JSON转模型数组第2天

    IOS开发基础之网易新闻JSON转模型数组第2天 // // HMHeadline.h // 01-网易新闻搭建 // // Created by 鲁军 on 2021/4/11. //#import ...

  8. IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天

    IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天 视频资料是2015年的,但是AFN是导入框架的关键文件,我尝试使用cocoapods安装最新的AFN,虽然成功了,但是版本太高, ...

  9. IOS开发基础之模拟科技头条项目案例32

    IOS开发基础之模拟科技头条项目案例32 说说这个项目的技术要点核心 ,首先是异步网络请求,block的回调,sdWebImage的使用.各个控件的使用,NSDate日期的转换.自动适配屏幕工作,模型 ...

最新文章

  1. pybind11向C++ dll 传递数组 图像
  2. Undefined Reference to Typeinfo
  3. oracle ora-00026,oracle错误代码
  4. [转] 我回答了90%的面试题,为什么还被拒?
  5. 201521123040《Java程序设计》第10周学习总结
  6. 单片微型计算机与接口技术第5版重点,韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答.pdf...
  7. blasphemy - 题解
  8. RabbitMQ基础进阶教程
  9. cad插件_CAD插件乱刀去教育戳记安装教程
  10. Citrix XenApp 6.5客户端自动下载(无需从官网下载)
  11. Python一个命令开启http下载服务器
  12. CSS特效(一):制作盒子荧光特效
  13. C++运算符过载详解
  14. 2018icpc ecfinal 西安游记
  15. Docker 停止容器
  16. Vue3警告:[Vue warn] Extraneous non-emits event listeners (changeParentProps) were passed to component
  17. win10设置窗口背景
  18. 社交APP的架构设计(技术篇)
  19. 2017最新qq第三方登陆教程
  20. 你的工作单休,但是工资双休

热门文章

  1. c语言control表题目,CMFCControl 问题
  2. vb6 combo根据index显示_彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index
  3. 不停机上线服务_【必看】10月25日本市增值税发票管理系统停机前,这些事一定要办...
  4. python输入框_selenium+python 对输入框的输入处理方法
  5. 读书到底为了什么,读研到底值不值?
  6. 拆解二战时期军用万用表,70多年前的万用表!
  7. 计算机文化基础主要讲了什么,计算机文化基础—讲义
  8. 山师计算机试题答案,山师计算机应用技术试题及答案
  9. 使用绝对定位时浏览器大小改变排版会乱_HTML amp; CSS页面布局之定位
  10. shownews.php,newsshow.php