![](/img/trans.png)
[英]Sending Data from iOS to java socket server and recognizes the message
[英]Sending Data from iOS to java socket server
嗨,我有下一个问题,为什么当我发送这样的数据时
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字节适用于大端字节序,而iOS则适用于小端字节序,但我没有找到有关如何执行此操作的信息。
uint8_t buffer [11] =“我发送了这个”; 到大尾数格式
请heellppp,谢谢。
抱歉,我的英语很好,但是西班牙语:/ thaks没有。
在服务器端的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;}
在您的请求字符串末尾添加\\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()
readUTF需要特定的格式,您需要将长度发送为16位无符号的big-endian short,然后是文本UTF编码。 我怀疑它以第一个字节为长度,可以算出很大的长度,因此它正在等待读取这么多字符。
UTF-8不是大字节序或小字节序,因此这对您来说不是问题。 如果要发送16位,32位或64位数据值,则字节顺序可能会出现问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.