IOS网络篇14之UIWebView第三方框架PBWeb的使用

来源:互联网 发布:如何自己查找淘宝漏洞 编辑:程序博客网 时间:2024/06/06 01:20

紧接上一篇:

IOS网络篇7之基于第三方CocoaAsyncSocket实现Socket通信(发送图片以及类似http头信息)

一般情况下CFSocket 和NSStream我们不会直接对它进行操作,如果我们用到了这两个部分,那么说明我们使用的已经非常底层了,在开发一些SDK或者修改第三方的框架的时候是需要掌握这些知识的。

服务器端的流程:

(1)创建一个Socket端点

socketid = socket(AF_INET,SOCK_STREAM,0);

    ADC Home > Reference Library > Reference > Mac OS X > Mac OS X Man Pages

    为socket通信创建一个可以使用的通信端点。AF_INET:指明使用何种通信协议,这里使用的是tcp。

    SOCK_STREAM:指明socket通信使用的流。socketid-1 表明socket创建错误。正确返回socket参考接口描述。

(2)初始化socket的参数并且将创建的socket名字绑定在我们刚新建的socket上

        memset(&addr,0,sizeof(addr));

        addr.sin_len    =sizeof(addr);

        addr.sin_family =AF_INET;

        addr.sin_port   =0;

        addr.sin_addr.s_addr =INADDR_ANY;

//      将所创建的socket的名字绑定在这个socket上(fd)

       bind(fd, (conststructsockaddr *) &addr,sizeof(addr));

(3)开始监听socket

//      开始监听socket 5表示挂起连接队列中的最大值,如果队列已满,这个时候client会收到ECONNREFUSED。

       listen(fd,5);

(4)获取当前使用的socket的名字

getsockname(fd, (structsockaddr *) &addr, &addrLen);

(5)获取一个可用的端口号

//            获取一个可用的socket端口号

            port =ntohs(addr.sin_port);

(6)利用本地参数创建一个CFSocketRef 并添加到Runloop中

CFSocketCreateWithNative(

           NULL

            fd, 

           kCFSocketAcceptCallBack

           AcceptCallback

            &context

        );

(7)根据第六步中的回调方法开始启动socket对端口的监听,建立socket与nsstream的联系
利用本地文件路径初始化NSOutputStream,即从socket获取的数据先到NSStream,然后从Stream到本地。

[NSOutputStreamoutputStreamToFileAtPath:self.filePathappend:NO];

(8)建立Socket和NSStream的联系

CFStreamCreatePairWithSocket(NULL, fd, &readStream,NULL);

(__bridgeNSInputStream *) readStream;

注意这里的readStream 是CFReadStreamRef。我们还需要将这个类型转化为NSInputStream。

(9)设置NSStream的各种属性,delegate,打开这个输入流。

    [NSSInputstream setProperty:(id)kCFBooleanTrueforKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];

   NSSInputstream.delegate =self;

    [NSSInputstreamscheduleInRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode];

    [NSSInputstreamopen];

(10)回调方法中接收数据

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

这里最重要的一个枚举是:NSStreamEventHasBytesAvailable

bytesRead = [NSInputStream read:buffermaxLength:sizeof(buffer)];

将NSInputStream 流中的数据存储到buffer中。返回读取数据的长度。最大可读maxLength。

[NSOutputStreamwrite:&buffer maxLength:sizeof(buffer)];

将buffer中的数据写入的NSOutputStream中,这里outputstream又关联在一个本地文件中,所以最终写入到本地文件中。

(11)图片展示 :从本地文件中读取

image = [UIImageimageWithContentsOfFile:self.filePath];


客户端流程:这里的输入输出流的作用刚好相反,就不一一描述,有一个地方要注意下:client 建立连接的方法

[[NSNetServicealloc]initWithDomain:@"local."type:@"xxx"name:@"yyy"];






0 0