Привет Я пытаюсь отправить сообщения на сервер 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
}
Большое спасибо за быстрый ответ. Я исправлю это и посмотрю, работает ли он :) и вы заинтересовались его int16_t. – HomeGrown
Пальцы, скрещенные, оба они хранят ints в том же формате. – Robadob
да, я проверил, что они оба 32 бита, я использовал int32_t только для того, чтобы быть в безопасности, но я не уверен в преобразовании большого эндианта/маленького конца. В очередной раз благодарим за помощь. – HomeGrown