我正在开发一个游戏应用程序,它将从服务器获取结构化数据并根据这些数据做出响应。
我已通过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?