网络编程:
socket
套接字 应用程序通过套接字和网络发送请求或向网络作出反应
网络通信其实就是socket之间的通信
数据在两个socket之间通过IO操作传输数据
是纯C语言
HTTP是由socket实现的
通信过程 :
需要导入头文件
import <sys/socket.h>
import <netinet/in.h>
import <arpa/inet.h>
//1 创建socket
//第一个参数 domain 协议簇 指定IPv4
//第二个参数 type socket的类型 流socket 数据报socket
//第三个参数 protocol 协议
int jiazia = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2 链接服务器
//参数一:套接字描述符
//参数二:指向数据结构sockaddr的指针,其中包括目的端口和IP地址
//参数三:参数二sockaddr的长度,可以通过sizeof(struct sockaddr)获得
//返回值
//成功则返回0,失败返回非0,错误码GetLastError()。
struct sockaddr_in jiegou;
jiegou.sin_family = AF_INET;
jiegou.sin_addr.s_addr = inet_addr("127.0.0.1");
jiegou.sin_port = htons(12345);
int lianjie = connect(jiazia, (const struct sockaddr *)&jiegou, sizeof(jiegou));
if (lianjie != 0) {
NSLog(@"链接失败");
return;
}
//3 向服务器发送数据
//发送的数据
//
const char *shuju = "hello world";
ssize_t sendshu = send(jiazia, shuju,strlen(shuju) , 0);
NSLog(@" 发送的字节数为 %zd",sendshu);
//4 接收服务器发送的数据
uint8_t buffer[1024];
ssize_t recvshuju = recv(jiazia, buffer, sizeof(buffer), 0);
NSLog(@"接收到数据的字节数 %zd",recv);
//将受到的数据转换为字符串
NSData *data = [NSData dataWithBytes:buffer length:recvshuju];
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
//5 关闭socket
close(jiazia);
响应和请求是由\r\n\r\n隔开的
字符串位置范围 fangeofstring 返回值为结构体
长连接: Keep-alive 响应结束后 隔一段时间再关闭连接 HTTP1.1
短连接: close 告诉服务器响应结束后将连接关闭 HTTP1.0
利用NSURL获取数据
利用NSURL获取数据的缺点:
无法设置请求头
无法设置缓存
无法设置超时时长
第二种请求数据的方法:
//设置请求头
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36" forHTTPHeaderField:@"User-Agent"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//NSHTTPURLResponse
if (!connectionError) {
//判断是否正常接收到服务器返回的数据
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304) {
//获取服务器的响应体
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"--%@",str);
}else{
NSLog(@"服务器内部错误");
}
}else{
NSLog(@"error: %@",connectionError);
}
}];
网络状态码:
200,304 可以看到返回的数据
2XX 是成功
3XX 需要重新定向
4XX 客户端错误
5XX 服务器错误
JSON
javaScript 的对象表示法
是jjavascript的对象
具有自我描述性 更容易理解
网络传输数据时 一般使用JSON和XML
独立于语言 其他语言一般有解析JSON的类/库
HTML基本格式:
<html>
<head>
<script>
var json = {
"name":"张三","age":"18"
}
</script>
</head>
<body>
</body>
</html>
解析JSON的类
NSJSONSerialization
拥有解析JSON的类方法
NSJSONSerialization JSONObjectWithData:<#(nonnull NSData *)#> 二进制数据 options:<#(NSJSONReadingOptions)#>操作类型 error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>错误
// NSJSONReadingMutableContainers = (1UL << 0), 容器可变
// NSJSONReadingMutableLeaves = (1UL << 1), 叶子可变,但是iOS7以后不起作用
// NSJSONReadingAllowFragments = (1UL << 2) 允许不是JSON形式的字符串
解决输出数组和字典时无编码的问题
给数组和字典添加一个分类 重写:
- (NSString *)descriptionWithLocale:(id)locale
方法
在方法中遍历拼接字符串
当我们输出对象时 默认会调用对象的description方法
可以在其中拼接字符串 输出对象的属性
如果模型中出现了数字 最好用NSNumber代替
最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧
github地址: https://github.com/FuThD