网络编程归纳总结二阶段

网络编程:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值