2013-07-31 2 views
1

Привет Я пытаюсь отправить сообщения на сервер Java, который я не могу изменить с устройства iOS. Я использую AsyncSocket и задавался вопросом, как отправлять и получать длину, добавленную к строке. Я делаю преобразование UTF строки в NSData, но мне было интересно, существует ли разница в размере примитива между двумя языками. Кроме того, есть большой конец и маленький конец? В принципе мне нужно, чтобы иметь возможность конвертировать следующие Java методы:Отправка сообщений на java-сервер в объекте-c через AsyncSocket

inStream.readUTF(); 
inStream.readInt(); 
inStream.readChar(); 
inStream.readShort(); 
inStream.readFully(recvBuff, 0, recvLen); 

outStream.writeInt(); 
outStream.writeUTF(); 
outStream.writeChars(); 
outStream.writeShort(); 
outStream.write(sendBytes, 0, sendBytes.length); 

Я знаю, что я очень близко, но что-то не совсем правильно, это то, что у меня до сих пор:

Я использую NSMutableArray для добавления данных и использования методов чтения и записи AsyncSockets.

[theSocket readDataToData:[AsyncSocket ZeroData] withTimeout:timeout buffer:buffer bufferOffset:offset tag:tag]; // inStream.readUTF(); 
[theSocket readDataToLength:sizeof(int32_t) withTimeout:timeout buffer:buffer bufferOffset:offset tag:tag]; // inStream.readInt(); 
[theSocket readDataToLength:sizeof(unichar) withTimeout:timeout buffer:buffer bufferOffset:offset tag:tag]; // inStream.readChar(); 
[theSocket readDataToLength:sizeof(int16_t) withTimeout:timeout tag:tag]; // inStream.readShort(); 
[theSocket readDataWithTimeout:timeout buffer:buffer bufferOffset:offset maxLength:maxLength tag:tag]; // inStream.readFully(recvBuff, 0, recvLen); 

[outputBufferStream appendBytes:&[sendString length] length:sizeof([sendString length])]; // outStream.writeInt(); 
[outputBufferStream appendData:[sendString dataUsingEncoding:NSUTF8StringEncoding]] // outStream.writeUTF(); 
char array[5]; 
[outputBufferStream appendBytes:array length:sizeof(array)]; // outStream.writeChars(); 
int16_t _short; 
[outputBufferStream appendBytes:&_short length:sizeof(_short)]; // outStream.writeShort(); 
unsigned char *sendBytes; 
[outputBufferStream appendBytes:sendBytes length:sendBytesLength]; // outStream.write(sendBytes, 0, sendBytes.length); 

Я обычно добавить длину в начале так:

int32_t sendStringLength = [sendString length]; 
[outputBufferStream appendBytes:&sendStringLength length:sizeof(sendStringLength)]; 

В конце записи я добавляющим следующее как терминатор:

[outputBufferStream appendData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

Я бы на самом деле оцените любую помощь с этим. Благодарю.

EDIT ::

я получил большинство из них работают благодаря Robadob. Вот немного ява сниппет (рабочий) бита я в настоящее время застрял, пытаясь получить работу на Objective-C:

private int sendData(String stringToSend) { 
    if (theSocket==null) { 
     lastError="sendData() called before socket was set up."; 
     return 1; // Error 
    } 

    try { 
     System.out.println("Sending "+stringToSend.length()+" chars ["+ stringToSend.length()*2+" bytes]"); 
     System.out.println("'" + stringToSend + "'"); 
     outStream.writeInt(stringToSend.length()*2); 
     outStream.writeChars(stringToSend); 
     outStream.flush(); 

    } catch (IOException e) { 
     lastError="sendData() exception: "+e; 
     System.out.println(lastError); 
     return 2; // Error 
    } 

    return 0; // Ok 
} 

Вот отрывок из того, что у меня до сих пор в Objective-C:

- (int32_t)sendData:(NSString *)stringToSend { 

    if (theSocket == nil) { 
     lastError = @"sendData called before socket was set up"; 
     return 1; // Error 
    } 

    @try { 

     NSLog(@"Sending %d chars [%d bytes]", [stringToSend length], ([stringToSend length] * 2)); 
     NSLog(@"'%@'", stringToSend); 

     uint32_t stringToSendInt = ([stringToSend length] * 2); 
     uint32_t stringToSendIntBigE = CFSwapInt32HostToBig(stringToSendInt); 
     [outputBufferStream appendBytes:&stringToSendIntBigE length:sizeof(stringToSendIntBigE)]; 
     stringToSend = [stringToSend stringByAppendingString:@"\n"]; 
     for (int i = 0; i < ([stringToSend length]); i++) { 
      unichar characterTmp = [stringToSend characterAtIndex:i]; 
      unichar character = characterTmp << 8; 
      [outputBufferStream appendBytes:&character length:sizeof(character)]; 
     } 

     [self syncWriteData:outputBufferStream withTimeout:socketTimeout tag:kSendDataSocketTag]; 
     outputBufferStream = [NSMutableData data]; 

    } 
    @catch (NSException *e) { 
     lastError = [NSString stringWithFormat:@"sendData exception: %@", [e reason]]; 
     NSLog(@"%@", lastError); 

     return 2; // Error 
    } 

    return 0; // Ok 
} 

ответ

0

Если вы прочитали документы для writeUTF, в нем говорится, что он записывает первые 2 байта, используя writeShort. Это говорит об

Записывает короткое замыкание на основной поток вывода в виде двух байтов, старший байт . Если исключение не генерируется, то счетчик получает приращение записывается на 2.

байт 8 бит, так что делает значение они пишут 16 бит, используется int32_t, которая составляет 32 бита. вы должны написать int16 или int16_t (я не объектив-c).

+0

Большое спасибо за быстрый ответ. Я исправлю это и посмотрю, работает ли он :) и вы заинтересовались его int16_t. – HomeGrown

+0

Пальцы, скрещенные, оба они хранят ints в том же формате. – Robadob

+0

да, я проверил, что они оба 32 бита, я использовал int32_t только для того, чтобы быть в безопасности, но я не уверен в преобразовании большого эндианта/маленького конца. В очередной раз благодарим за помощь. – HomeGrown