美文网首页
Socket网络编程

Socket网络编程

作者: 灰斗儿 | 来源:发表于2018-07-22 19:16 被阅读12次

    一台设备上会有很多的应用程序,每个应用程序会有各自的端口,一台设备最多有65535个端口。
    socket就像是一个小保安,端口就像是一个大门,只有大门有小保安守着才会把门打开,如果无人把手,大门就是关着的。
    所谓网络通信就像是打电话,A小区的小保安要给B小区的小保安 寄生日贺卡,必须先打电话过去问问B小保安在不在(尝试连接到服务器),如果不在(端口未开放),就不寄了。如果在,就联系快递发过去(发送消息),对方收到后,写一封感谢信回复给A小保安(请求响应)。
    例如IOS 中的AFNetworking,是基与 NSURLConnection,NSURLConnection就是基于Socket。

    //
    //  ViewController.m
    //  SocketDemo
    //
    //
    #import "ViewController.h"
    #import <sys/socket.h>
    #import <netinet/in.h>
    #import <arpa/inet.h>
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self initSocket];
    }
    
    - (void)initSocket{
    //初始化本地socket服务
    //参数:协议(ipv4)、传输协议(tcp SOCK_STREAM /udp SOCK_DGRAM)
    //请一个小保安
    int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    
    //连接服务器
    //参数:客户端socket、包含ip地址和端口的结构体、数据长度
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(80);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //尝试打电话,看B小保安在不在要寄到的那个大门守着
    int connectResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));
    
    if (connectResult == 0) {
        NSLog(@"链接成功");
    }else{
        NSLog(@"链接失败");
        return;
    }
    //发送数据
    NSString *sendMeg = @"hello world";
    //参数:客户端socket、内容地址、内容长度、发送方式标志
    //发快递
    ssize_t sendResultLen = send(clientSocket, sendMeg.UTF8String, sizeof(sendMeg.UTF8String), 0);
    NSLog(@"发送了 %ld字节", sendResultLen);
    //接受数据
    //参数:客户段socket、内容缓冲区、缓冲区长度、接受方式(0 阻塞等待服务器返回数据)
    uint8_t buffer[1024];
    //收到感谢信
    ssize_t recvResultLen = recv(clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"接受到了%ld字节", recvResultLen);
    NSData *data = [NSData dataWithBytes:buffer length:recvResultLen];
    NSString *receiveStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", receiveStr);
    
    //关闭链接
    close(clientSocket);
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    @end
    

    相关文章

      网友评论

          本文标题:Socket网络编程

          本文链接:https://www.haomeiwen.com/subject/khkrmftx.html