2012-03-17 91 views
1

您好我有下一个问题,为什么当我在Java socket服务器从iOS版将数据发送到Java套接字服务器

connection = new Socket(Constants.HOST, Constants.CHAT_LISTENER_PORT); 
_in = new DataInputStream(connection.getInputStream()); 
String data = _in.readUTF(); 

但没有在对方发送数据,这样

uint8_t buffer[11] = "I send this"; 

NSInteger nwritten = [outputStream write:buffer maxLength:sizeof(buffer)]; 

if (-1 == nwritten) { 
    NSLog(@"Error writing to stream %@: %@", outputStream, [outputStream streamError]); 
}else{ 
    NSLog(@"Wrote %i bytes to stream %@.", nwritten, outputStream); 
} 

看起来好像它没有发送任何东西。

我读了很多,我发现问题是从平台上,因为java字节与big-endians和iOS与小端,但我没有找到有关如何做到这一点的信息。

uint8_t buffer [11] =“我发送这个”;以big-endians格式

请heellppp,谢谢。

对不起,我的英语很不错,但西班牙语里没有什么:/ thaks。

+0

你的英文很好。 ;) – 2012-03-17 18:29:51

回答

5

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

DataInputStream.readUTF(); 

这.readUTF()期待一个UTF Java本机类型什么是不符合客观-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

不能正常工作....客户端收到空字符串.... – user847988 2012-05-13 14:15:22

+0

没有这个工作对我来说也许服务器是错误的:/ – NTTake 2012-05-14 00:51:55

+0

谢谢......为我工作:) – sanman 2017-01-17 06:56:28

0

readUTF需要一个特定的格式,需要发送长度为大端16位无符号短,然后是文本UTF编码。我怀疑它把第一个字节作为长度的一部分,因此它正在等待这么多字符被读取。

UTF-8不是大端或小端,所以这对你来说不是问题。如果您发送的是16位,32位或64位数据值,那么您可能会遇到排序问题。

+0

谢谢,你是对的,但我不明白这一点。 – NTTake 2012-03-20 17:07:22

+0

[link](http://stackoverflow.com/questions/9796633/sending-data-from-ios-to-java-socket-server-and-recognizes-the-message) – NTTake 2012-03-21 05:03:34

+0

请帮忙谢谢。 – NTTake 2012-03-21 05:03:58

0

在您的请求字符串末尾添加\n

例如uint8_t buffer[] = "I send this\n",它可能工作。

0

swift4版本的答案。

extension String { 
    func javaUTF8() -> Data? { 
     guard let data = self.data(using: .utf8) else { 
      return nil 
     } 
     let length = self.lengthOfBytes(using: .utf8) 
     var buffer = [UInt8]() 
     buffer.append(UInt8(0xff & (length >> 8))) 
     buffer.append(UInt8(0xff & length)) 
     var outdata = Data() 
     outdata.append(buffer, count: buffer.count) 
     outdata.append(data) 
     return outdata 
    } 
} 

您可以使用它,如下所示。

let data = "hello word".javaUTF8() 
相关问题