2014-10-17 3 views
0

iPhone의 iOS 앱과 삼성 Galaxy S3의 Android 앱은 Wi-Fi 네트워크에서 서로 통신해야합니다.TCP iOS 앱과 Android 앱 간의 소켓 통신

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]; 
} 

== 안드로이드 부품 == 위의 코드에서

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 앱은 서버이며, 안드로이드 응용 프로그램은 클라이언트입니다 . 나는 위의 코드에서 할 것을 예정하고있어 무엇

  • 안드로이드 응용 프로그램은 메시지를 전송하고 iOS 앱은 그것을받습니다. 각 메시지는 개행 문자로 식별됩니다. 안드로이드 앱은 println 메서드로 메시지를 보내고 iOS 앱은 CRLF (새 라인) 문자를받을 때까지 메시지를받습니다.

  • iOS 앱이 메시지를 보내고 Android 앱이 메시지를 수신합니다. 각 메시지는 개행 문자로 식별됩니다. iOS 응용 프로그램은 CRLF를 마지막에 첨부하여 메시지를 보내고 안드로이드 응용 프로그램은 readline 방법으로 메시지를받습니다. 안드로이드 응용 프로그램은 메시지를 보낼 때


문제이며, iOS 앱의 didReceiveData 대리자가 호출되지 않습니다. 한 가지는 iOS 앱 소켓이 스트리밍에서 CRLF 문자를 찾을 수 없다는 것입니다.

실제 데이터 다음에 CRLF 바이트 ([0x0d, 0x0a])를 첨부하여 Android 앱에서 메시지를 보내려고했으나 행운이 없었습니다.

답변

0

Java/Android의 경우 PrintWriter.println()은 OS 관련 줄 바꿈을 씁니다. CRLF은 Windows 줄 바꿈입니다. Android에서는 대신 LF을 사용합니다. iOS 리더가 CRLF만을 예상하고 LF을 허용하지 않으면 결코 실행되지 않습니다. `) (

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

고맙습니다 실제 용액 out.flush '이었다

는 CRLF 강제 대신 PrintWriter.print()를 사용한다. 그것을 해결! – adeltahir

관련 문제