2014-10-17 39 views
0

三星Galaxy S3上的iPhone和Android應用上的iOS應用需要在Wifi網絡上相互通信。iOS應用和Android應用之間的TCP Socket通信

我在iOS應用中使用CocoaAsyncSocket庫,在Android應用中使用java.net.Socket

== iOS應用部分==

- (void)socket:(GCDAsyncSocket *)sender didAcceptNewSocket:(GCDAsyncSocket *)newSocket 
{ 
    [clientSocketList addObject:newSocket]; 

    NSMutableDictionary *newClientInfo = [[NSMutableDictionary alloc] init]; 
    [newClientInfo setObject:@"0" forKey:@"status"]; 

    [clientInfoList addObject:newClientInfo]; 

    [newSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0]; 
} 
- (void) writeData:(NSData*)data to:(GCDAsyncSocket*)sock { 
    NSMutableData *dataWithLine = [data mutableCopy]; 
    [dataWithLine appendData:[GCDAsyncSocket CRLFData]]; 

    [sock writeData:dataWithLine withTimeout:-1 tag:0]; 
} 

== Android部分==

public boolean connectServer() { 
    try { 
     socket = new Socket(SOMEIP, SOMEPORT); 

     binaryInput = socket.getInputStream(); 
     this.input = new BufferedReader(new InputStreamReader(binaryInput)); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while(status != STATUS_STOPPED) { 
       try { 
        String read = input.readLine(); 
        //Doing stuff 
       } catch (IOException e) { 
          e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
} 

public void sendMessage(String message) { 
    out.println(message); 
} 

在上面的代碼,iOS應用是在服務器和Android應用是客戶端。

什麼,我打算在上面的代碼做的是

  • Android應用程序發送的消息和iOS應用接收它。每條消息都由新的行字符標識。 Android應用程序發送消息println方法和iOS應用程序接收消息,直到收到CRLF(新行)字符。

  • iOS應用程序發送消息,Android應用程序收到它。每條消息都由新的行字符標識。 iOS應用程序通過附加CRLF發送消息,Android應用程序通過readline方法接收消息。


問題是,當Android應用程序發送的消息,iOS應用的didReceiveData委託不叫。有一點很清楚,iOS應用程序套接字在流式傳輸中找不到CRLF字符。

我試圖通過在真實數據後附加CRLF字節([0x0d,0x0a])發送來自Android應用程序的消息,但沒有運氣。

回答

0

在Java/Android中,PrintWriter.println()寫入了一個OS特定的換行符。 CRLF是Windows換行符。在Android上,它使用LF代替。如果iOS閱讀器僅預期CRLF並且不允許LF,它將永遠不會被觸發。

要強制CRLF,使用PrintWriter.print()代替:

public void sendMessage(String message) { 
    out.print(message + "\r\n"); 
} 
+0

Thanks.The實際的解決辦法是'了out.flush()'。解決了! – adeltahir 2014-10-17 18:15:57

相關問題