Socket

Socket :套接字/插座.  --- "通信模型",不属于网络七层协议.Socket中至少包含了 网络层 传输层 协议,其他几层也有包含(表示/会话).

作用 :解决"不同应用程序"之间的通信问题.

Socket :
"主机" + "端口"  == Socket

七层协议:

网络层:{
   
    IP
地址:寻找主机的.
   
   
通过 IP 地址 建立  "主机" "主机" 之间的通信.
}

传输层:{
   
    TCP/UDP
协议  ---- "端口"(应用程序)
   
   
通过 端口号 建立 "端口" "端口" 之间的通信.
}

Socket :
所有app开发的底层都是基于 Socket 来实现的. 即时通信(自己手写 Socket XMPP(AsyncSocket))

Socket = TCP/IP(
最简单/最常用的Socket)  ,  Socket = UDP/IP


步骤:
{
   
0. 在终端中输入命令
    nc -lk
端口号 :始终监听本地计算机此端口的数据.
   
   
   
1.导入三个头文件
    {
        #import <sys/socket.h>
        #import
<netinet/in.h>
        #import
<arpa/inet.h>
    }
   
   
2.Socket书写步骤
    {
       
1.创建客户端Socket            socket(<#int#>, <#int#>, <#int#>);
       
2.创建服务器Socket            struct sockaddr_in serverAddress;
       
3.连接到服务器(Socket编程)     connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);
       
4.发送数据给服务器            send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)
       
5.接收服务器返回的数据          recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)
       
6.关闭 Socket                close(socketNumber)
    }
   
   
/*
    
创建客户端 Socket.
    
三个参数: domain:网络地址类型 type:端口类型 protocal:传输协议
    
     domain:
协议域 指定socket主机地址类型. 网络层协议 AF_INET/IPv4协议; AF_INET_6/IPv6协议
    
     type:
指定Socket端口类型. 指定传输层协议类型(TCP/UDP),SOCK_STREAM(TCP/) ,SOCK_DGRAM(UDP/报文头)
    
     protocal:
指定传输协议:常用协议:IPPROTO_TCPIPPROTO_UDP等,分别对应TCP传输协议、UDP传输协议.
    
    
最后一个参数传0,会根据第二个参数,自动选择第二个参数对应的协议.
    
    
返回值:如果 > 0 表示成功.
     */

   
   
// 0.创建客户端 Socket.
   
int socketNumber = socket(AF_INET, SOCK_STREAM, 0);
   
   
if (socketNumber > 0) {
        NSLog(
@"Socket创建成功:%d",socketNumber);
    }
else{
        NSLog(
@"Socket创建失败");
    };
   
   
/*
    
连接到服务器.
    
三个参数:
    
     1.
客户端socket.
     2.
接收方的socket参数.
     3.
数据长度.
    
    
返回值: 0 表示成功,其他: 错误代号.
     */

   
   
   
// 1.服务器socket
   
struct sockaddr_in serverAddress;
   
// IPv4协议.
    serverAddress.sin_family = AF_INET;
   
// 接收方(服务器)IP地址.
    serverAddress.sin_addr.s_addr = inet_addr(
"127.0.0.1");
   
// 端口号.
    serverAddress.sin_port = htons(
56789);
   
   
   
// 2.连接到服务器

   
// serverAddress 的数据长度.
    socklen_t length =
sizeof(serverAddress);
   
// 连接服务器.
   
// C语言中,传递结构体的时候,会指定结构体的长度
   
// &取的是数据的起始位置,只有传递一个数据的长度,才能够保证拿到完整的结构体数据.
   
// 返回值:0成功,其他都是失败.
   
int connection = connect(socketNumber, (const struct sockaddr *)&serverAddress,length);
   
   
if (!connection) {
        NSLog(
@"连接成功%d",connection);
    }
else{
        NSLog(
@"连接失败");
    }
   
   
/*
    
发送消息到服务器
    
参数:
     1>
客户端Socket.
     2>
发送内容地址.
     3>
发送内容长度.
     4>
发送方式标识,一般为0.
    
     */

   
   
// 3.发送消息到服务器
   
   
// 发送消息内容
    NSString *msg =
@"hello socket!";
   
    msg.length :
表示的是OC字符串的长度.
    msg.UTF8String :
OC字符串转换成 UTF8 ASCII ,一个汉字需要占用3个字节的长度.
    strlen :
计算所有 ASCII 码的长度.
   
   
// 发送消息
    ssize_t result = send(socketNumber, msg.UTF8String, strlen(msg.UTF8String),
0);
   
    NSLog(
@"result = %ld",result);
   
   
/*
    
接收服务器接返回的消息
    
参数:
     1>
客户端Socket.
     2>
接收内容缓存区.
     3>
接收内容缓存区长度.
     4>
接收方式.0表示阻塞式.必须等待服务器返回数据.
    
    
返回值:
    
如果成功,则返回接收到的字节数.失败则返回SOCKET_ERROR
    
     */

   
   
// 4.服务器接收消息
   
   
// 创建接收内容缓存区.
    uint8_t buffer[
1024];
   
// 接受消息
    ssize_t len = recv(socketNumber, buffer,
sizeof(buffer), 0);
   
    NSLog(
@"len: %zd",len);
   
// 取出接受内容缓存区中的数据.
    NSData *data = [NSData dataWithBytes:buffer length:len];
   
// 将二进制流数据data转换成字符串类型.
    NSString *receive = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(
@"receive:%@",receive);
   
   
// 5.关闭Socket
    close(socketNumber);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值