繁体   English   中英

将数据从iOS发送到Java套接字服务器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM