socket访问百度

本文档展示了如何在iOS应用中使用Socket连接到百度服务器,发送GET请求,并解析响应以在UIWebView中加载网页。首先在`viewDidLoad`中建立连接,然后发送HTTP GET请求,接收到响应后提取响应体,并在Webview中加载。

@property(nonatomic,assign) int clientSocket;

@property (weak, nonatomic) IBOutlet UIWebView *webview;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    

    //1.连接百度服务器 终端命令 ping www.baidu.com

    if([self connectToServerWithIP:@"61.135.169.125" port:80]){

        NSLog(@"连接成功");

    }

    

    //2.发送请求

    /*

     从浏览器监控得到的请求格式

     GET / HTTP/1.1

     Host: www.baidu.com

     Connection: keep-alive (可选)

     */

    

    NSString *sentString = @"GET / HTTP/1.1\r\n"

    "Host: www.baidu.com\r\n"

    "Connection: close\r\n\r\n";

    //keep-alive

    NSString *recvString = [self sendAndRecv:sentString];

//    NSLog(@"%@",recvString);

    

    //得到完整的响应,分离响应体

    NSRange range = [recvString rangeOfString:@"\r\n\r\n"];

    

    NSString *responseString = [recvString substringFromIndex:range.location+range.length];

    

//    NSLog(@"%@",responseString);

    //显示网页webview

    /*

     baseURL 指定基地址,用于给相对路径找打完整路径

     相对路径

     http://www.baidu.com/1/1.jpg

     1/1.jpg

     */

    [self.webview loadHTMLString:responseString baseURL:[NSURL URLWithString:@"http://www.baidu.com"]];

}


//连接服务器

-(BOOL)connectToServerWithIP:(NSString *)ipString port:(int)port{

    

    self.clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in addr;

    //指定ipv4

    addr.sin_family = AF_INET;

    //端口号 高地位转换

    addr.sin_port = htons(port);

    

    addr.sin_addr.s_addr = inet_addr(ipString.UTF8String);

    

    int connResult =  connect(self.clientSocket, (const struct sockaddr *)&addr, sizeof(addr));

    

    if(connResult == 0){

        return YES;

    }else{

        return NO;

    }

}


//发送数据并接收数据

-(NSString *)sendAndRecv:(NSString *)message{

    //大集合,用于分批次接收百度服务器发送的数据

    NSMutableData *mData = [NSMutableData data];

    

    char *string = message.UTF8String;

    ssize_t sentLen = send(self.clientSocket, string, strlen(string), 0);

    

    char *buffer[1024];

    ssize_t recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 0);


    //buffer转换成nsdata

    NSData *data = [NSData dataWithBytes:buffer length:recvLen];

    [mData appendData:data];

    

    while (recvLen!=0) {

        recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 0);

        NSData *data = [NSData dataWithBytes:buffer length:recvLen];

        [mData appendData:data];

    }

    

    //大集合转换成NSString

    NSString *recvString = [[NSString alloc] initWithData:mData.copy encoding:NSUTF8StringEncoding];

    

    return recvString;

}


@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值