從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);
}
~~~
其實也不難 對吧
**效果:**
