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

时间:2012-03-17 18:22:12

标签: java objective-c

嗨,我有下一个问题,为什么我发送这样的数据

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。

4 个答案:

答案 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()