牛骨文教育服务平台(让学习变的简单)

从socket的创建开始说起(连接到京东。。。)

我们只要理解了各个参数,那么就学会了创建和连接

//连接到京东
- (void)connection{
    if ([self connectionToHost:@"111.13.28.23" port:80]) {
        // 发送数据
        NSString *request = @"GET / HTTP/1.1
"
        "Host:m.jd.com
"
        "User-Agent:iPhone AppleWebKit
"
        "Connection:Close

";
        NSString *result = [self sendAndRecv:request];
        NSLog(@"接收到的内容result = %@",result);
        // 查找


        NSRange range = [result rangeOfString:@"

"];
        if (range.location != NSNotFound) {
            // 找到


            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