socket的位置.png
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
int socket(int domain, int type, int protocol);
int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
作用:用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址
int connect(int sockfd, const struct sockaddr * serv_addr, socklen_t addrlen);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(12345);
int result = connect(clientSocket, (const struct sockaddr *) &addr, sizeof(addr));
if (result != 0) {
NSLog(@"失败");
return;
}
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family; //类型:IPV4类型
in_port_t sin_port; //端口号,要使用大尾顺序(各个计算机CPU型号不同,存储的顺序也会不同,htons()函数会将各个计算机统一为网络需要的大尾顺序)
struct in_addr sin_addr; //IP地址,无符号长整型数字,调用结构体中s_addr,通过inet_addr()函数可以转换字符串
char sin_zero[8];
};
#include < sys/socket.h >
用来将数据由指定的 socket 传给对方主机。使用 send 时套接字必须已经连接。send 不包含传送失败的提示信息,如果检测到本地错误将返回-1。因此,如果send 成功返回,并不必然表示连接另一端的进程接收数据。所保证的仅是当send 成功返回时,数据已经无错误地发送到网络上。
ssize_t send(int s, const void * msg, size_t len, int flags);
const char *msg = "hello world";
ssize_t sendCount = send(clientSocket, msg, strlen(msg), 0);
NSLog(@"发送的字节数 %zd",sendCount);
NSString *request = @"GET / HTTP/1.1\r\n"
"Host: www.baidu.com\r\n"
"Connection: keep-alive\r\n\r\n";
"Connection: keep-alive\r\n\r\n";长连接 "Connection: keep-close\r\n\r\n";短连接 //http/1.0 短连接 当响应结束后连接会立即断开 //http/1.1 长连接 当响应结束后,连接会等待非常短的时间,如果这个时间内没有新的请求,就断开连接
ssize_t recv(int s, void * buf, size_t len, int flags);
//接收服务器返回的数据
//返回的是实际接收的字节个数
uint8_t buffer[1024];
ssize_t recvCount = recv(clientSocket, buffer, sizeof(buffer), 0);
NSLog(@"接收的字节数 %zd",recvCount);
//把字节数组转换成字符串
NSData *data = [NSData dataWithBytes:buffer length:recvCount];
NSString *recvMsg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@“收到的字符串 : %@",recvMsg);
http响应头的特点,发现http请求头最后结尾的位置,发现最后是"\r\n\r\n"结尾的,那我们只需要找到"\r\n\r\n"的位置,然后截取收到的http返回的数据!最后将数据给webView就行!
//找到\r\n\r\n 的范围
NSRange range = [respose rangeOfString:@"\r\n\r\n"];
//从\r\n\r\n之后的第一个位置开始截取字符串 响应体
NSString *html = [respose substringFromIndex:range.length + range.location ];
int close(int s); s 套接字描述符
//发送和接收数据
- (NSString *)sendAndRecv:(NSString *)sendMsg {
//3 向服务器发送数据
//成功则返回实际传送出去的字符数,失败返回-1
const char *msg = sendMsg.UTF8String;
ssize_t sendCount = send(self.clientSocket, msg, strlen(msg), 0);
NSLog(@"发送的字节数 %zd",sendCount);
//4 接收服务器返回的数据
//返回的是实际接收的字节个数
uint8_t buffer[1024];
NSMutableData *mData = [NSMutableData data];
ssize_t recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);;
[mData appendBytes:buffer length:recvCount];
//服务器会返回多次数据,等所有的数据都接收完成,再转换成字符串
while (recvCount != 0) {
recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);
NSLog(@"接收的字节数 %zd",recvCount);
[mData appendBytes:buffer length:recvCount];
}
//把字节数组转换成字符串
NSString *recvMsg = [[NSString alloc] initWithData:mData.copy encoding:NSUTF8StringEncoding];
return recvMsg;
}