网络:请求本地服务器做法(socket)

#import "ViewController.h"
#import <sys/socket.h> // 没注释
#import <netinet/in.h>
#import <arpa/inet.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *ipAdress;
@property (weak, nonatomic) IBOutlet UITextField *port;
@property (weak, nonatomic) IBOutlet UITextField *messageInput;
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
@property (nonatomic, assign) int clientSocket;

@end

@implementation ViewController
- (IBAction)connection:(id)sender {
    [self createSocketAndConnectionWithIPAddress:self.ipAdress.text port:[self.port.text integerValue]];
}

/*
 1. 如果请求是走socket 的,不需要配置https 相当的上网问题
 */
- (IBAction)send:(id)sender {
    // 连接百度的时候停住了,这个时候不是没反应
//    NSString *message = @"GET / HTTP/1.1\r\n"
//    "Host: localhost\r\n"
//    "Connection: Close\r\n\r\n";

    //原版:
    NSString *message = @"GET /test.txt HTTP/1.1\r\n"
    "Host: localhost\r\n"
     "Connection: Close\r\n\r\n";

  [self sendAndRecv:message];


//    NSString *msg = [self sendAndRecv:message];
//    NSLog(@"%@",msg);
//    self.resultLabel.text = msg;
}



- (void)createSocketAndConnectionWithIPAddress:(NSString *)IPAddress port:(NSInteger)port {
    // 创建socket
    /**
     参数解析
     第 1个参数 domain 协议域(AF_INET,IPV4 网络开发) (IPV6 不需要管)
     第 2个参数 type socket类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP)
     第三个参数 protocol 协议,如果输 0,可以根据第 2 个参数, 自动选择协议
     返回值:如果返回>0 则表 成功 */
    int result = socket(AF_INET, SOCK_STREAM, 0);
    if (result > 0) {
        NSLog(@"创建成功%d",result);
    }
    // 连接
    /**
     1. 第一个 socket
     2. 服务器地址
     */
    struct sockaddr_in serverAddress;
    // 设置ip 127.0.0.1
    serverAddress.sin_addr.s_addr = inet_addr([IPAddress UTF8String]);
    // 设置端口号(高低位转换)
    serverAddress.sin_port = htons(port);
    // 设置协议
    serverAddress.sin_family = AF_INET;
    // 连接socket
    int connectResult = connect(result, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
    if (connectResult == 0) {
        self.resultLabel.text = @"连接成功";
    }
    self.clientSocket = result;
}

// 发送消息和接收消息
- (NSString *)sendAndRecv:(NSString *)sendMsg {
    NSString *message = sendMsg;
    // 发送消息
    /*
     1. socket
     2. 发送的内容
     3. 内容的长度
     发送的标记 通常写 0 就可以
     */
    ssize_t sendResult = send(self.clientSocket, [message UTF8String], strlen([message UTF8String]), 0);
    NSLog(@"...%ld",sendResult);

    // 接收
    /*
     1, socket
     2. 接收的数据
     3. 接收的长度
     4. 写0代表阻塞式
     */
    uint8_t buff[1024];
    //    NSLog(@"buff -- %ld",sizeof(buff));
    ssize_t recvResult;
    NSMutableData *dataM = [NSMutableData data];

    while (recvResult != 0)
    {
         recvResult = recv(self.clientSocket, buff, sizeof(buff), 0);
        [dataM appendBytes:buff length:recvResult];
        NSLog(@"recv == %ld",recvResult);
    }

    //    NSLog(@"%ld",recvResult);
    // 把收到的数据转成OC
    NSString *recvMessage = [[NSString alloc]initWithData:dataM encoding:NSUTF8StringEncoding];
    NSLog(@"--%@",recvMessage);
    return recvMessage;
}

- (void)closeConnection {
    close(self.clientSocket);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
/*
 1. ip 找到对应的电脑
 2. 端口号 找到对应的程序
 3. 协议 发送内容方式
 */

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

@end

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值