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

来源:互联网 发布:知乎为什么叫b乎 编辑:程序博客网 时间:2024/06/07 03:40
#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
原创粉丝点击