Сокетное соединение между Java и Objective C - PullRequest
1 голос
/ 29 мая 2011

Я пытаюсь написать сервер на Java и связаться с ним с помощью приложения для iPhone (Цель C).Соединение установлено, и я могу записать данные на сервер, но не могу прочитать данные обратно с сервера.Я получаю уведомление о том, что есть данные для чтения, но они пусты.

Код Java был взят в основном из примера Oracle .

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;

out.println("Hello World");

while ((inputLine = in.readLine()) != null) {
    System.out.println(inputLine);
    System.out.flush();

    out.println("test");

    if (inputLine.equals("Bye")) {
        break;
    }
}

out.close();
in.close();
socket.close();

.Цель клиента C:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^(void) {
        NSLog(@"staying alive!");
        [[DABMultitaskingController sharedInstance] startTask];
    }];

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.0.1.189", 4444, &readStream, &writeStream);

    NSInputStream *inputStream = (NSInputStream *)readStream;
    NSOutputStream *outputStream = (NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

    _dataToSend = [[NSData dataWithBytes:"This is a test" length:15] retain];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    switch (streamEvent) {
        case NSStreamEventHasBytesAvailable: {
            NSLog(@"can read: %@", theStream);

            uint8_t *buffer;
            NSUInteger length;
            [(NSInputStream *)theStream getBuffer:&buffer length:&length];
            NSData *data = [NSData dataWithBytes:buffer length:length];
            NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"bytes: %@", data);
            NSLog(@"string: %@", string);

            break;
        }
        case NSStreamEventHasSpaceAvailable: {
            NSLog(@"can write: %@", theStream);

            if (_dataToSend != nil) {
                NSLog(@"write: %@", _dataToSend);
                [(NSOutputStream *)theStream write:[_dataToSend bytes] maxLength:[_dataToSend length]];
                [_dataToSend release];
                _dataToSend = nil;
            }

            break;
        }
        case NSStreamEventOpenCompleted: {
            NSLog(@"open complete: %@", theStream);

            break;
        }
        case NSStreamEventErrorOccurred: {
            NSLog(@"error occurred: %@", theStream);

            break;
        }
        case NSStreamEventEndEncountered: {
            NSLog(@"end encountered: %@", theStream);

            break;
        }
        default:
            break;
    }
}

Ответы [ 2 ]

1 голос
/ 29 мая 2011

вы никогда не отправляете перевод строки \ n стороне java. BufferedReader использует их как разделители для readLine ();

_dataToSend = [[NSData dataWithBytes:"This is a test\n" length:16] retain];
0 голосов
/ 29 мая 2011

Похоже, мне нужно было использовать read:maxLength:.Работает нормально сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...