iphone – 流来获取数据 – NSInputStream

iphone – 流来获取数据 – NSInputStream,第1张

概述所有, 我有一个服务器,它有一个用于通信的tcp套接字流.我需要访问该流并读取它需要发送给我的初始数据. 我目前的代码如下.说实话,我完全失明了.我不确定这是否正确,更不用说正确的工作了. -(void) initNetworkCommunication{ //input stream NSInputStream *iStream; NSURL *url = [url i 所有,

我有一个服务器,它有一个用于通信的tcp套接字流.我需要访问该流并读取它需要发送给我的初始数据.

我目前的代码如下.说实话,我完全失明了.我不确定这是否正确,更不用说正确的工作了.

-(voID) initNetworkCommunication{    //input stream    NSinputStream *iStream;    NSURL *url = [url initWithString:@"192.168.17.1:2004"];    [iStream initWithURL:url];    [iStream setDelegate:self];    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];    [iStream open];}

所以从我看到它的方式来看,这段代码初始化了流,但是如何从流中读取?

谢谢

解决方法 有两种方法可以从流中获取数据:轮询和使用流事件.

轮询更简单,但会阻止它运行的线程.如果使用此方法,则不需要执行setDelegate:或scheduleInRunLoop:forMode:calls.通过重复调用read:maxLength:来执行轮询.

NSInteger result;uint8_t buffer[BUFFER_LEN]; // BUFFER_LEN can be any positive integerwhile((result = [iStream read:buffer maxLength:BUFFER_LEN]) != 0) {    if(result > 0) {        // buffer contains result bytes of data to be handled    } else {        // The stream had an error. You can get an NSError object using [iStream streamError]    }}// Either the stream ran out of data or there was an error

使用流事件需要设置委托并将流添加到运行循环.当某些事件发生时(包括接收数据时),流将向其委托发送stream:handleEvent:消息,而不是阻塞线程.然后,委托可以从流中检索数据.这是一个示例流:handleEvent:方法:

- (voID)stream:(NSinputStream *)iStream handleEvent:(NsstreamEvent)event {    BOol shouldClose = NO;    switch(event) {        case  NsstreamEventEndEncountered:            shouldClose = YES;            // If all data hasn't been read,fall through to the "has bytes" event            if(![iStream hasBytesAvailable]) break;        case NsstreamEventHasBytesAvailable: ; // We need a semicolon here before we can declare local variables            uint8_t *buffer;            NSUInteger length;            BOol freeBuffer = NO;            // The stream has data. Try to get its internal buffer instead of creating one            if(![iStream getBuffer:&buffer length:&length]) {                // The stream Couldn't provIDe its internal buffer. We have to make one ourselves                buffer = malloc(BUFFER_LEN * sizeof(uint8_t));                freeBuffer = YES;                NSInteger result = [iStream read:buffer maxLength:BUFFER_LEN];                if(result < 0) {                    // error copying to buffer                    break;                }                length = result;            }            // length bytes of data in buffer            if(freeBuffer) free(buffer);            break;        case NsstreamEventErrorOccurred:            // some other error            shouldClose = YES;            break;    }    if(shouldClose) [iStream close];}
总结

以上是内存溢出为你收集整理的iphone – 流来获取数据 – NSInputStream全部内容,希望文章能够帮你解决iphone – 流来获取数据 – NSInputStream所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1068676.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存