2012-03-20 58 views
3

我不明白这一点,我在我的应用程序和服务器端做这个代码不认识好消息为什么?发送数据从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

这已经从字符串消息是我要送,但与000000这个000是不是CERO的I I#$ _ 0是正方形的,但我不知道怎么写这个字。

和旁边的错误

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?请大家抱歉,因为我的英语很糟糕。 :/

+1

你能告诉的Java代码的阅读呢?问题可能很容易就是Java期待UTF-8,UCS-2或其他编码。 – biziclop 2012-03-20 23:40:37

+0

没有男人,我不这么认为,因为在服务器的另一端等待下一段代码'DataInputStream.readUTF()'的数据,并且消息出现在服务器上,但其他字符如000000000不是零点有正方形。任何想法请有人帮助!对不起我的英文:/ – NTTake 2012-03-21 04:39:55

回答

2

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

+0

这是我无法移动或修改服务器端代码的问题,因为这对于androide和bb非常适用,我需要发送'DataInputStream.readUTF()'的porperly数据芦苇好消息,任何想法,请有人帮助!抱歉,我的英语很不好 :/。 – NTTake 2012-03-21 04:10:32

+0

@ user1276068所以你需要坚持它在'DataOutputStream.writeUTF()'下指定的内容。显然你不是。 – EJP 2012-03-21 05:15:45

3

对不起,我的英文很糟糕。 :/ 最后,我发现在Java代码中解决头痛哈哈哈哈,yeaaa :)

在服务器端中的下一行:

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

干杯.....

相关问题