从NSStream中读取“结构化/序列化数据”

时间:2017-05-13 12:02:09

标签: ios objective-c

我正在开发一个游戏应用程序,它将从服务器获取结构化数据并根据这些数据做出响应。

我已通过NSSream将应用程序连接到互联网。具体来说,我遵循Apple's guide的教程。所以我的代码看起来像:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:
        {
            if(!_data) {
                _data = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            NSInteger len = 0;
            len = [(NSInputStream *)stream read:buf maxLength:1024];
            if(len) {
                [_data appendBytes:(const void *)buf length:len];
                // bytesRead is an instance variable of type NSNumber.
                [bytesRead setIntValue:[bytesRead intValue]+len];
            } else {
                NSLog(@"no buffer!");
            }
            break;
        }
        // continued

我的问题是: “我怎样才能将_data转换为我想要的格式” 。例如,我的服务器将发送两种类型的数据。对于每个数据,第一个字节是数据类型的指示符(例如,1表示数据类型1,2表示数据类型2)。对于数据类型1,将int(4字节)作为数据本身发送。对于数据类型2,将int(4字节)作为以下字符串字节的大小发送。例如,如果此int为10,那么将从服务器发送10个以上的字节以形成客户端的字符串。

我的Android(Java)应用程序中的代码如下所示:

// dataIn = new DataInputStream(socket.getInputStream());
private void keepPacketRecving(){ // this will be executed in a separate thread
    while(keepRecvThreadRunning) {
        try {
            byte type;
            type = dataIn.readByte();
            if(type == 1){
                int data = dataIn.readInt();
                getTye1Data(data); // callback function for receiving type 1 data (int)
            } else if (type ==2) {
                int dataSize = dataIn.readInt();
                byte[] buf = new byte[dataSize];
                // ... loop to read enough byte into buf ...
                String data = new String(buf);
                getType2Data(data); // callback function for receiving type 2 data (String)
            }
        }
    }
}

我还注意到我在switch语句中不能有一个while循环来请求inputStream读取更多数据,因为它会挂起线程。

我想最好的方法是将所有字节都附加到_data中(如示例所示)并有另一个函数来解析_data?然后问题是我如何从数据中查找字节并只取出其中的一部分(例如,20字节_data中的10个字节)。

Objective-C中是否有任何包装器,如Java中的DataInputStream?

0 个答案:

没有答案