将数据从iOS发送到Java套接字服务器并识别该消息
我不明白这一点,我在我的应用程序中做这个代码,并在服务器端不认识这个消息为什么?
NSString *init = @"?II#$%_0"; NSData *myData = [init dataUsingEncoding:NSUTF16BigEndianStringEncoding]; uint8_t *readBytes = (uint8_t *)[myData bytes]; int size = [myData length]; int myInteger = CFSwapInt16HostToBig(size); NSInteger nwritten = [outputStream write:readBytes maxLength:myInteger];
而在远程服务器的另一端识别消息,但不是这样的。
0I0I0#0$0%0_0O0000000000000000#0000000000000000
这是从string消息的II#$ _ 0我发送但000000和这个000不是cero是一个正方形,但我不知道如何写这个字符。
接下来的错误
java.io.UTFDataFormatException: malformed input around byte 27 at java.io.DataInputStream.readUTF(DataInputStream.java:639) at java.io.DataInputStream.readUTF(DataInputStream.java:547)
我不明白 请大家抱歉,因为我的英文很糟糕。 :/
对不起,我的英文很糟糕。 :/最后我find了头痛的解决办法hahahaha,yeaaa 🙂
在java代码的下一行服务器端:
DataInputStream.readUTF();
这个.readUTF()期望一个UTF java nativetypes与objective-ctypes不一样,并且解决scheme就是这样发送UTF原生java编码的string。
NSString *msg = @"initChat_"; NSString *messageToSend = [NSString stringWithFormat:@"%@", msg]; NSData *data = [self convertToJavaUTF8:messageToSend]; int dataLenght = [data length]; int num = [outputStream write:(const uint8_t *)[data bytes] maxLength:dataLenght]; if (-1 == num) { NSLog(@"Error writing to stream %@: %@", outputStream, [outputStream streamError]); }else{ NSLog(@"Wrote %i bytes to stream %@.", num, outputStream); }
而魔术来自:
- (NSData*) convertToJavaUTF8 : (NSString*) str { NSUInteger len = [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; Byte buffer[2]; buffer[0] = (0xff & (len >> 8)); buffer[1] = (0xff & len); NSMutableData *outData = [NSMutableData dataWithCapacity:2]; [outData appendBytes:buffer length:2]; [outData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]]; return outData;}
干杯…..
DataInputStream.readUTF()
读取以特殊的前缀格式编码的数据,并且在Javadoc中为DataOutputStream.writeUTF()
。 这不是读取UTFstring的通用方法。 使用适当的字符集的BufferedReader
。