嗨,我有下一个问题,为什么我发送这样的数据
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套接字服务器的另一端
connection = new Socket(Constants.HOST, Constants.CHAT_LISTENER_PORT);
_in = new DataInputStream(connection.getInputStream());
String data = _in.readUTF();
但没有任何东西看起来好像没有发送任何东西。
我读了很多,我发现问题来自平台,因为java字节适用于big-endians和带小端的iOS,但我没有找到有关如何做到这一点的信息。
uint8_t buffer [11] ="我发送此消息&#34 ;;到big-Endians格式
请heellppp,谢谢。
抱歉,我的英语非常好,但西班牙语中没有任何内容:/ thaks。
答案 0 :(得分:5)
在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 :(得分:0)
readUTF需要一种特定的格式,需要将长度作为16位无符号short的大端发送,然后是UTF编码的文本。我怀疑它将第一个字节作为长度产生大量数字,因此它等待读取这么多字符。
UTF-8不是大端或小端,所以这对你来说不是问题。如果要发送16位,32位或64位数据值,则可能会出现字节序问题。
答案 2 :(得分:0)
根据您的请求,字符串结尾添加\n
例如uint8_t buffer[] = "I send this\n"
,它可能有用。
答案 3 :(得分: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()