Socket的创建和连接
最后更新于:2022-04-01 14:25:10
从socket的创建开始说起(连接到京东。。。)
我们只要理解了各个参数,那么就学会了创建和连接
~~~
//连接到京东
- (void)connection{
if ([self connectionToHost:@"111.13.28.23" port:80]) {
// 发送数据
NSString *request = @"GET / HTTP/1.1\r\n"
"Host:m.jd.com\r\n"
"User-Agent:iPhone AppleWebKit\r\n"
"Connection:Close\r\n\r\n";
NSString *result = [self sendAndRecv:request];
NSLog(@"接收到的内容result = %@",result);
// 查找\r\n\r\n
NSRange range = [result rangeOfString:@"\r\n\r\n"];
if (range.location != NSNotFound) {
// 找到\r\n\r\n
NSString *html = [result substringFromIndex:range.location];
NSLog(@"接收到的内容html = %@",html);
[self.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://m.jd.com"]];
}
}
}
~~~
**连接到服务器**
~~~
- (BOOL)connectionToHost:(NSString *)host port:(int)port{
// 创建客户端socket
/**
参数
domain: 协议域/协议族,AF_INET(IPV4的网络开发)
type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数自动选择协议
返回值
socket,如果>0 就表示成功
*/
self.clientSocket = socket(AF_INET, SOCK_STREAM, 0);
// 建立连接
/**
参数
1> 客户端socket
2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址。即服务器的“结构体”地址
3> 结构体数据长度
返回值
0 成功/其他 错误代号,非0即真
*/
struct sockaddr_in socketServer;
// 1.协议---> 确定如何传输数据
socketServer.sin_family = AF_INET;
// 2.ip --> 通过ip找主机 inet_addr内部对字符串也进行了字节翻转(高低位互换)
socketServer.sin_addr.s_addr = inet_addr(host.UTF8String);
// 3.端口 ---> 通过端口找程序 htons:对整数进行高低位换号
socketServer.sin_port = htons(port);
return (connect(self.clientSocket, (const struct sockaddr *)&socketServer, sizeof(socketServer)) == 0);
}
~~~
**发送和接收**
~~~
- (NSString *)sendAndRecv:(NSString *)msg{
// 发送数据
/**
参数
1> 客户端socket
2> 发送内容地址 void * == id
3> 发送内容长度,是指字节的长度。
4> 发送方式标志,一般为0
返回值
如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
*/
ssize_t sendLength = send(self.clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);
NSLog(@"发送了%ld字节,%zd--%zd",sendLength,msg.length,strlen(msg.UTF8String));
// 读取数据
/*
参数1:客户端的socket
参数2:接收内容的地址
参数3:接收内容的长度,告诉服务器一次只能接收多少字节的内容
参数4:接收方式标志,一般为0 表示阻塞式等待服务器响应
返回
— 接收的字节数
*/
uint8_t buffer[1024];
NSMutableData *dataM = [NSMutableData data];
ssize_t recvLength = -1;
while (recvLength != 0) {
recvLength = recv(self.clientSocket, buffer, sizeof(buffer), 0);
// 2000 80
NSLog(@"接收了%ld 字节",recvLength);
[dataM appendBytes:buffer length:recvLength];
}
NSString *resultStr = [[NSString alloc] initWithData:dataM encoding:NSUTF8StringEncoding];
return resultStr;
}
~~~
**断开连接**
~~~
- (void)disconnection{
// 断开连接
close(self.clientSocket);
}
~~~
其实也不难 对吧
**效果:**
![Socket](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-07_570611019701c.jpg "")