Я пытаюсь настроить сервер Java, разговаривающий с клиентом iPhone, используя GCDAsyncSocket. По какой-то причине мой клиентский код на iPhone не считывает все данные.GCDAsyncSocket didReadData только получает вызов один раз
Я вижу, что didReadData вызывается в первый раз, но больше никогда. В идеале мне нужно подражать функциональности HTTP-протокола, где он отправляет заголовок, а затем полезную нагрузку. Размер полезной нагрузки будет в заголовке. Но это не сработало, поэтому я еще больше упростил свой код в надежде найти проблему. Ниже приведен код, а ниже - вывод.
клиент:
- (BOOL) sendString:(NSString *) string
{
[asyncSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding]
withTimeout:-1 tag:TAG_PAYLOAD];
[asyncSocket readDataToLength:1 withTimeout:(-1) tag:TAG_HEADER];
}
- (void) socket:(GCDAsyncSocket *) sock didReadData:(NSData *)data
withTag:(long)tag
{
NSString *str = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"Read data %@ with tag: %ld", str, tag);
if(tag == TAG_HEADER)
{
//TODO - parse the header, get the fields
[sock readDataToLength:3 withTimeout:-1 tag:TAG_PAYLOAD];
//[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1
tag:TAG_PAYLOAD];
}
else
{
NSLog(@"Payload... %@", str);
NSLog(@"Tag: %ld", tag);
}
}
Java сервер:
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String clientCommand = in.readLine();
System.out.println("Client Says :" + clientCommand);
out.println("Andrew\r\nAUSTIN\r\n");
out.flush();
Однако, на клиенте, то единственное, что я получаю обратно А. Точный результат: чтения данных А с тегом: 10
Мой вопрос:
- Почему метод didReadData никогда не вызывается снова? Должно быть больше «Andrew \ r \ nAustin» возвращено на клиенте. Но это просто зависает. ReadDataToData и readDataToLength оба, похоже, никогда не получают полную строку.
- Я заметил, что CRLF определен в GCDAsyncSocket.h не \ r \ n, а вместо этого шестнадцатеричные значения. Это имеет значение? Вот почему я попробовал метод readDataToLength, но все еще не удалось. Но я хотел бы знать, имеет ли это кроссплатформенность или нет.
Спасибо.