2012-09-21 4 views
0

내 비동기 네트워크와 함께 안드로이드 클라이언트가 있는데 잘 작동합니다. 그러나 어떤 시점에서 서버는 거의 동시에 2 개의 메시지를 전송합니다 (서버에 2 개의 다른 스레드가 있습니다). 그러나 클라이언트에서는 그럴 때 이미 수신 된 첫 번째 메시지 만 수신합니다. 메시지를 파싱하는 동안 성공했지만 실패했습니다. 누군가가 나를 도울 수 있다면 어떻게이 문제를 해결할 수 있습니까?Android의 비동기 네트워크 스트림

내를 받게되며 코드 :

interface RecieveCallback { 
    void callback(int recievedBytes, InputStream stream); 
} 


public class Recieve implements Runnable { 
    private RecieveCallback callback; 
    private InputStream stream; 
    private byte[] buffer; 

    public Recieve(InputStream inStream, byte[] _buffer, RecieveCallback _callback) { 
     callback = _callback; 
     stream = inStream; 
     buffer = _buffer; 
    } 


    public void run() { 
     try { 
      while (true) { 
       final int recievedBytes = stream.read(buffer); 
       (new Runnable() { 

        public void run() { 
         callback.callback(recievedBytes, stream);      
        } 
       }).run();  
      } 
     } catch (IOException e) { 
      Log.e("Recieve", e.getMessage()); 
     } 
    } 

} 



public Connection() { 
    this(host, port); 
} 

public Connection(String ip, int _port) { 
    inMessage = new NetworkMessage(); 
    try { 
     serverAddres = InetAddress.getByName(ip); 
     socket = new Socket(serverAddres, _port); 
     socketOut = socket.getOutputStream(); 
    } catch (IOException e) { 
     Log.e("Connect", e.getMessage()); 
    } 
} 

public void Connect() { 
    try { 
     BeginRecieve(socket.getInputStream(), inMessage.getBuffer(), new RecieveCallback() {    
      public void callback(int recievedBytes, InputStream stream) { 
       OnRecieve(recievedBytes, stream);    
      } 
     }); 
    } catch (IOException e) { 
     Log.e("BeginRecieve", e.getMessage()); 
    } 
} 

public boolean EndRead(int recievedBytes, InputStream stream) { 
    int size = (int)inMessage.GetUInt32() + 4; 

    while (recievedBytes < size) { 
     try { 
      recievedBytes += stream.read(inMessage.getBuffer(), recievedBytes, (size - recievedBytes)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    inMessage.setLength(size); 

    return true; 
} 

public void OnRecieve(int recievedBytes, InputStream stream) { 
    inMessage.setPosition(0); 

    if (!EndRead(recievedBytes, stream)) { 
     return; 
    } 

    NetworkMessage tempMessage = inMessage; 

    if (!ParseMessage(tempMessage)) { 
     //Tratar erro 
    } 
} 


public void BeginRecieve(InputStream inStream, byte[] _buffer, RecieveCallback _callback) { 
    if (beginRecieve != null && beginRecieve.isAlive()) { 
     beginRecieve.interrupt(); 
    } 

    beginRecieve = new Thread(new Recieve(inStream, _buffer, _callback)); 
    beginRecieve.start(); 
} 
+0

코드 및 자세한 내용은 도움이 될 것입니다. – sandrstar

+0

수신 할 코드가 있으며, 구문 분석 기능을 호출하고 계속 수신합니다. –

답변

0

나는 해결책을 얻었다. 문제는 클라이언트가 두 메시지를 동일한 버퍼에 수신한다는 것이 었습니다. 하지만 첫 번째 코드 만 처리하므로 코드를 변경해야만 동일한 버퍼에 1 개 이상의 메시지가 표시되고 모든 메시지를 하나의 메시지에 넣을 수 있으므로 동일한 방식으로 구문 분석 할 수 있습니다.

관련 문제