iOS NSStream tcp服务器客户端无法通信

我在Bonjour的目标c中开发一个tcp服务器/客户端时遇到了问题。

在服务器端,我打开正确的流,并使用handleEvent函数发送和接收数据。 但我不知道发送和接收数据的正确方式是什么。 我读了这篇优秀的文章:正确的方式通过NSOutputStream通过套接字发送数据所以我使用数据包排队系统发送数据:

    switch(eventCode) {

    case NSStreamEventOpenCompleted: {
        NSLog(@"Complete");

    } break;

    case NSStreamEventHasSpaceAvailable: {
        if (stream == _outputStream)
            [self _sendData];
    } break;

...

- (void)_sendData {
flag_canSendDirectly = NO;
NSData *data = [_dataWriteQueue lastObject];
if (data == nil) {
    flag_canSendDirectly = YES;
    return;
}
uint8_t *readBytes = (uint8_t *)[data bytes];
readBytes += currentDataOffset;
NSUInteger dataLength = [data length];
NSUInteger lengthOfDataToWrite = (dataLength - currentDataOffset >= 1024) ? 1024 : (dataLength - currentDataOffset);
NSInteger bytesWritten = [_outputStream write:readBytes maxLength:lengthOfDataToWrite];
currentDataOffset += bytesWritten;
if (bytesWritten > 0) {
    self.currentDataOffset += bytesWritten;
    if (self.currentDataOffset == dataLength) {
        [self.dataWriteQueue removeLastObject];
        self.currentDataOffset = 0;
    }
}

}

。 所以基本上我只是发送很多数据包的数据。 但是我不知道如何在客户端重新构建数据。 我想我没有正确理解NSStreamEventHasBytesAvailable事件。 因为在这里我发送了很多数据包,但是客户端的这个事件只能调用一次。 当我从缓冲区重建数据时,数据似乎已损坏。 我真的很感激,如果有人能够澄清这一切,这个文件不是很清楚(或者我可能会错过一点)。

        case NSStreamEventHasBytesAvailable: {
        if (stream == _inputStream)
        {
            //read data
            uint8_t buffer[1024];
            int len;
            while ([_inputStream hasBytesAvailable])
            {
                len = [_inputStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0)
                {
                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
                    //NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
                    UnitySendMessage("AppleBonjour_UnityNetworkManager(Clone)", "OnLocalClientReceiveMessageFromServer", [output cStringUsingEncoding:NSUTF8StringEncoding]);
                }
            }
        }

看来,你使用两个变量currentDataOffset - 一个实例变量和一个属性 - 出于同样的目的。 如果你确实需要它们两个,你也应该将0设置为currentDataOffset 。 但我认为片段应该看起来像:

readBytes += currentDataOffset;
NSUInteger dataLength = [data length];
NSUInteger lengthOfDataToWrite = MIN(dataLength - currentDataOffset, 1024);
NSInteger bytesWritten = [_outputStream write:readBytes maxLength:lengthOfDataToWrite];
if (bytesWritten > 0) {
    currentDataOffset += bytesWritten;
    if (currentDataOffset == dataLength) {
        [self.dataWriteQueue removeLastObject];
        currentDataOffset = 0;
    }
}
链接地址: http://www.djcxy.com/p/30499.html

上一篇: iOS NSStream tcp server client can't communicate

下一篇: Devise, guest users causes filter chain halted