2012-03-20 86 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;} 

乾杯.....

相關問題