ios-Socket通信浅析

Socket又叫套接字,应用程序通过”套接字“向网络发送请求,或者向网络做出应答。

网络通信其实就是Socket之间的通信

数据是在两个Socket之间通过IO传输数据的

socket编程API是纯C语言的,是跨平台的

HTTP协议是基于Socket的,HTTP协议的底层用的就是Socket,Socket是用来实现数据传输的


引用:socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。


Socket通信在我们客户端做的事情

创建Socket,设置连接的指定端口

连接到服务器

发送数据给服务器

从服务器接收数据

关闭连接

如果是服务器的话,它首先会根据地址类型比如说是IPV4还是IPV6,还有根据socket的类型和协议来创建Socket

之后给Socket取绑定IP地址和端口号,之后服务器回去监听这个端口号的请求以准备去接收客户端发来的连接,

这个时候服务器的socket是没有打开的,在服务器上收到了客户端的请求之后才会被动的去打开,去接收客户端请求,

直到客户端返回连接信息。一个socket同一个时间只能去连接一个客户端的socket,这个socket断开连接才可以连接下一个。

如果我们想实现服务器可以连接到多个客户端的话,我们可以在服务器创建多条线程去创建多个socket,但是创建socket

和关闭socket是比较耗资源的连接请求。一般会把socket创建好了实例放在数组里面,放到连接池里面,如果有新的客户端的socket来连接拿出来用就好了


Socket是处于应用层和传输层之间

我们用本地作为服务器模拟了一个socket通信的过程,实现的基本功能是我们在终端中输入nc -lk 端口号,这样我们就可以在程序中模拟给服务器发消息,消息将显示在终端中,终端中输入发生的消息,程序也可以进行接收。

//1、创建Socket
    //第一个参数 domain 协议簇 我们指定IPV4
    //第二个参数 type 就是socket的类型,有流socket和数据报socket等
    //第三个参数protocol 协议的意思 当我们输入为0.系统会根据第二个参数来设置默认的协议
    //返回值,如果创建成功就返回socket的描述符,失败就返回-1
    int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //2、连接服务器
    //第一个参数 socket的描述符
    //第二个参数 结构体 ip地址和端口要设置
    //第三个参数 结构体的长度
    //返回值,如果成功返回0,失败返回非0值
    struct 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(@"失败");
        return;
    }
    //3、向服务器发生数据
    //成功就返回实际传输出去的字符数。失败就返回-1
    const char * message="hello";
    //第一个参数是Socket的描述符,第二个参数是你要发的消息,第三个参数是你发送的字符数,第四个参数我们默认为0,是否阻塞的意思
    ssize_t sendCount=send(clientSocket, message, strlen(message), 0);
    NSLog(@"%zd",sendCount);
    //4、接受服务器返回的数据
    //返回的是实际接受的字节个数
    //第一个参数是socket的描述符,第二个参数是保存字节的字节数组,第三个参数是字节个数,第四个参数是是否阻塞。
    uint8_t buffer[1024];
    ssize_t recvCount=recv(clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"接受到的字节数 %zd",recvCount);
    //把字节数组转换为字符串,这里长度用实际的字符数,防止出现问题
    NSData * data=[NSData dataWithBytes:buffer length:recvCount];
    NSString * string=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",string);
    //5、关闭连接
    close(clientSocket);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值