您的位置:首页 > 理论基础 > 计算机网络

网络:socket 访问百度

2016-04-05 16:10 465 查看
#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 (weak, nonatomic) IBOutlet UIWebView *webView;
@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: m.baidu.com\r\n"
"Connection: Close\r\n\r\n";
NSString *html = [self sendAndRecv:message];
// 把掉头部的一些字符串
NSRange range = [html rangeOfString:@"\r\n\r\n"];
//    NSLog(@"%@",NSStringFromRange(range));
if (range.location != NSNotFound) {
// 找到\r\n\r\n
html = [html substringFromIndex:range.location];

}
[self.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://m.baidu.com"]];
}

- (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 = @"连接成功";
NSLog(@"链接成功");
}
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[10240];
//    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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: