从iOS版将数据发送到Java套接字服务器
您好我有下一个问题,为什么当我在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。
在在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;}
不能正常工作....客户端收到空字符串.... – user847988 2012-05-13 14:15:22
没有这个工作对我来说也许服务器是错误的:/ – NTTake 2012-05-14 00:51:55
谢谢......为我工作:) – sanman 2017-01-17 06:56:28
readUTF需要一个特定的格式,需要发送长度为大端16位无符号短,然后是文本UTF编码。我怀疑它把第一个字节作为长度的一部分,因此它正在等待这么多字符被读取。
UTF-8不是大端或小端,所以这对你来说不是问题。如果您发送的是16位,32位或64位数据值,那么您可能会遇到排序问题。
在您的请求字符串末尾添加\n
例如uint8_t buffer[] = "I send this\n"
,它可能工作。
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()
你的英文很好。 ;) – 2012-03-17 18:29:51