将数据从iOS发送到Java套接字服务器并识别该消息

时间:2012-03-20 23:37:11

标签: java ios

我不明白这一点,我在我的应用程序中执行此代码并且在服务器端不能很好地识别该消息为什么?

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

这就是我在字符串消息中的#$ _ 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)

我不明白wh ??请抱歉抱歉我的英语非常糟糕。 :/

2 个答案:

答案 0 :(得分:3)

对不起,我的英格丽斯非常糟糕。 :/ 最后我找到了头痛的解决方法hahahaha,yeaaa:)

在Java代码的下一行中的服务器端:

DataInputStream.readUTF();

这个.readUTF()期望一个UTF java本机类型与objective-c类型不一样,解决方案是发送字符串编码在UTF原生java中这样。

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;}

干杯.....

答案 1 :(得分:2)

DataInputStream.readUTF()读取已使用Javadoc for DataOutputStream.writeUTF()生成的特殊前缀格式编码的数据。它不是读取UTF字符串的通用方法。使用带有适当字符集的BufferedReader