2011-05-29 49 views
1

我正尝试在Java中编写服务器,并使用iPhone应用程序与它进行通信(目标C)。连接过程中,我可以写入数据到服务器,但我无法从服务器读取数据。我收到一条通知,指出有数据要读取,但是它是空的。该代码大部分来自an Oracle exampleJava与Objective C之间的套接字连接

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(); 

而Objective 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; 
    } 
} 

回答

0

看起来我需要使用read:maxLength:来代替。现在工作正常。

+0

在哪里添加这应该已编辑您的问题与答案。 – 2015-02-27 13:11:25

1

你从来没有发送一个换行符\ n向Java方面的BufferedReader使用这些作为分隔符的readLine();

_dataToSend = [[NSData dataWithBytes:"This is a test\n" length:16] retain]; 
+0

这是真的,但它不会是问题的根本原因。 “BufferedReader”可以(完全)读取不以行分隔符结束的数据流。 – 2011-05-29 02:18:39

+0

似乎与http://stackoverflow.com/questions/4051018/nsinputstream-getbuffer-length-doesnt-work相关只是让你自己的缓冲区和使用阅读我猜 – 2011-05-29 02:23:50

+0

这并没有解决上述问题,但它确实使通讯更可靠。 – 2011-05-29 15:05:16