自己动手写iPhone wap浏览器之BSD Socket引擎篇(手把手教你iphone开发&nbs

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 07:03 点击:

作者:孙东风 2009-12-01(转载请注明出处)

 

在《自己动手写iPhone wap浏览器之预备篇》中笔者讲述了进行iPhone wap浏览器开发的主要流程如下:

²        封装BSD Socket进行HTTP请求。

²        将请求到的WML页面解析成XML数据结构。

²        渲染需要在界面上显示的WML标签(英文名tag)。

²        将渲染后的WML标签显示在界面上(UIView)。

 

在《自己动手写iPhone wap浏览器之预备篇》中已经讲述了利用tinyxml解析请求到的XML页面内容的知识,这个章节里主要讲述利用BSD Socket封装HTTP引擎的知识。在笔者的文章《玩转iPhone网络通讯之BSD Socket篇》中已经初步讲解了iPhone中利用BSD Socket进行网络通讯的关键技术点,但是笔者只是把请求的WML页面内容保存在一个缓冲区内。在实际应用中,大多数情况下需要解析请求到的WML页面内容从而区分开HTTP响应的包头、包体,有时候还需要解析HTTP包头的每行内容。要做到这些,首先需要BSD Socket引擎同步的解析请求到的数据,修改部分如下:

 

NSMutableString* readString = [[NSMutableString alloc] init];

char readBuffer[1];

 

int br = 0;

NSMutableString* readHeaderBufferStr = [[NSMutableString alloc] init];

while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)))

{

[readHeaderBufferStr appendString:[NSString stringWithCString:readBuffer length:sizeof(readBuffer)]];

 

if([self RecvRespHeaderFinished:readHeaderBufferStr])

{

break;

}else

{

}

}

 

笔者把缓冲区的大小改为1,这样每次读取一个字符到缓冲内并把每次读取到的内容添加到readHeaderBufferStr内,之后调用RecvRespHeaderFinished:readHeaderBufferStr方法判断HTTP头部内容是否读取完成,这个方法的实现如下:

 

- (BOOL)RecvRespHeaderFinished:(NSString*) aReadBuffer

{

    int len = [aReadBuffer length];

    if(len < 12)

    {

        return NO;

    }

   

    if([aReadBuffer characterAtIndex:(len-4)] == (const unichar)&&

        [aReadBuffer characterAtIndex:(len-3)] == (const unichar) &&

        [aReadBuffer characterAtIndex:(len-2)] == (const unichar)&&

        [aReadBuffer characterAtIndex:(len-1)] == (const unichar) )

    {

        NSLog(@"ResponseHeader = %@",aReadBuffer);

        int nCode = [self GetResponseCode:aReadBuffer];

        NSLog(@"get http response code = %d",nCode);

       

        if(nCode > 299 || nCode < 200)

        {

            NSLog(@"ErrMsg:Server response code is %d.",nCode);

            close(sockfd);

        }

       

        contentlen = [[self GetHttpHdrFieldValue:aReadBuffer aField:EContentLength] intValue];

        NSLog(@"contentlen = %d",contentlen);

        return YES;

    }

   

    return NO;

}

 

笔者通过判断缓冲字符串的后四个字符是否依次为’’、’ ’、’’、’ ’来断定HTTP头部是否解析完成,如果解析完成则打印出来并返回YES,否则返回NO,最后并调用GetHttpHdrFieldValue:aReadBuffer:aField方法获取HTTP包头中指定行的value值,在这里笔者需要获取"Content-Length

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • UITableView一些方法
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1