2013-03-28 2 views
3

J'ai un thread qui traite de la réception et l'envoi de paquets UDP, cela fonctionne bien jusqu'à ce que X quantité de paquets ont été reçus, puis le client arrête juste d'essayer de recevoir des paquets, et arrête de les envoyer , toutes les fonctions de capture n'affichent rien, le client arrête juste de demander des paquets. Voici mon code d'exécution clientThread Android s'arrête

public void run() 
{ 
    if(host == true) { setUpClient(); server.start(); } 
    rdyForPlay = true; 
    boolean run = true; 
    boolean setupPlayer = false; 
    while(run) 
    { 
     //Tell the server to give position of players 
     //if(setupPlayer == true) 
     //{ 
     // setUpClient(); 
     // setupPlayer = false; 
     //} 

     if(host == false) 
     { 
      try { 
       if(socket == null) 
       { 
        socket = new DatagramSocket(port); 
       } 
       byte[] bufer = new byte[256]; 
       //String msg = "position"; 
       String msg = ID +":"+ assets[ID].returnPosX() +":"+ assets[ID].returnPosY(); 
       int msgLength = msg.length(); 
       bufer = msg.getBytes(); 
       InetAddress address; 
       address = InetAddress.getByName("192.168.1.59"); 
       DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port); 
       socket.send(p); 

      } catch (UnknownHostException e2) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with unknown host"); 
       e2.printStackTrace(); 
      } catch (SocketException e) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with socket"); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with sending/receiving data"); 
       e.printStackTrace(); 
      } 

      byte[] buf = new byte[256]; 
      DatagramPacket packet = new DatagramPacket(buf, buf.length); 
      try 
      { 
       socket.receive(packet); 
      } 
      catch (IOException e) 
      { 
       Log.d(TAG, "Error with receiving data"); 
       e.printStackTrace(); 
      } 

      String data = new String(buf, 0, packet.getLength()); 
      //Split the string up 
      String[] dataArray = data.split("#"); 
      int newTotalPlayers = Integer.parseInt(dataArray[0]); 
      if(newTotalPlayers != totalPlayers) 
      { 
       Log.d(TAG," what is total amount of players:" + newTotalPlayers); 
       if(newTotalPlayers == 1) 
       { 
        newPlayer(0); 
        totalPlayers = newTotalPlayers; 
       } 
       else 
       { 
        newPlayer(newTotalPlayers); 
        totalPlayers = newTotalPlayers; 
       } 
       //if(ID == 0 && host == false) 
       //{ 
       // ID = newTotalPlayers; 
       // setupPlayer = true; 
       //} 
      } 
      //Do a for loop to go through dataArray 
      for(int i = 0; i < totalPlayers; i++) 
      { 
       String[] pos = dataArray[(i + 1)].split(":"); 
       if(Integer.parseInt(pos[(i*3)]) == ID) 
       { 
        Log.d(TAG, "Do nothing please"); 
       } 
       else 
       { 
        assets[i].setPosition(Integer.parseInt(pos[(i*3) + 1]), Integer.parseInt(pos[(i*3) + 2])); 
       } 
      } 

     } 

    } 
    Log.d(TAG, "Error with run value"); 
} 

Cela fonctionne bien, il vient vraiment me tracasse que la connexion est interrompue après si longtemps pour une raison étrange, que je ne trouve rien est imprimé à tout LogCat

Toile

PS plus de code peut être donné si nécessaire

Voici ma méthode d'exécution du serveur

public void run() { 
    InetAddress client = null; 
    boolean run = true; 
    String data = ""; 
    DatagramPacket packet = null; 
    while(run) 
    { 
     if(data.equalsIgnoreCase("")) 
     { 
      /*Log.d(TAG, "waiting for clients"); 
      String msg = "waiting"; 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      DatagramPacket p = new DatagramPacket(message, msgLength, client, port); 
      try 
      { 
       socket.send(p); 
      } 
      catch (IOException e2) 
      { 
       Log.d(TAG, "Error with sending"); 
       e2.printStackTrace(); 
      }*/ 
     } 

     //Send some data 
     if(data.equalsIgnoreCase("connect")) 
     { 
      Log.d(TAG, "ID send :" + packet.getAddress()); 
      address.add(packet.getAddress()); 
      players += 1; 
      String msg = String.valueOf(players); 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      DatagramPacket p = new DatagramPacket(message, msgLength, packet.getAddress(), port); 
      try 
      { 
       socket.send(p); 
      } 
      catch (IOException e2) 
      { 
       Log.d(TAG, "Error with sending"); 
       e2.printStackTrace(); 
       data = ""; 
      } 
     } 

     //if(/*data.equalsIgnoreCase("position")*/ address.size() > 0) 
     //{ 
      //Create for loop to create the string 
      String msg = ""; 
      msg = players + "#"; 
      for(int i = 0; i < players; i++) 
      { 
         msg += + i + ":" + assets.get(i).returnPosX() + ":" + assets.get(i).returnPosY() + ":"; 
      } 
      //msg = String.valueOf( 
      //  players + ":" + 
      //  "1:" + assets.get(0).returnPosX() + ":" + assets.get(0).returnPosY()); 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      for(int i = 0; i < address.size() ; i++) 
      { 
       DatagramPacket p = new DatagramPacket(message, msgLength, address.get(i), port); 
       try 
       { 
        socket.send(p); 
       } 
       catch (IOException e2) 
       { 
        Log.d(TAG, "Error with sending"); 
        e2.printStackTrace(); 

       } 
      } 
      //Log.d(TAG, "Data sent is:" + msg); 
     //} 

     data = " "; 

     //Receive some data 
     byte[] buf = new byte[256]; 
     packet = new DatagramPacket(buf, buf.length); 
     try 
     { 
      socket.receive(packet); 
     } 
     catch (IOException e) 
     { 
      Log.d(TAG, "Error with receiving data"); 
      e.printStackTrace(); 
     } 

     data = new String(buf, 0, packet.getLength()); 
     //Log.d(TAG, "Data received was :" + data); 

     try 
     { 
      this.sleep(25); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      Log.d(TAG, "Error with trying to sleep"); 
      e.printStackTrace(); 
     } 
    } 
    Log.d(TAG, "Error with while run value"); 
} 

Désolé les commentaires

+0

intéressant, peut-être la connexion est-elle arrêtée d'une manière ou d'une autre? – Eugene

+0

Je posterai ma méthode d'exécution de serveur – Canvas

+1

J'ajouterais la notation montrant quand le client 1) va recevoir un paquet (y compris le nombre de paquets reçus); 2) a reçu un paquet (y compris le nombre de paquets reçus); 3) se termine. En général, j'ai vu WiFi se déconnecter et se reconnecter sans raison apparente; vous devez probablement vous reconnecter si c'est le cas. – 18446744073709551615

Répondre

1

On dirait un scénario de Deadlock est en cours avec les deux codes sources accroché socket.receive

Heureusement, le code pour les codes client Android et J2SE UDP Server sont identiques, essayez donc ce code dans votre machine et déboguer pour voir ce qui se passe. Vous pouvez mettre des instructions d'impression pour mieux savoir.

De plus, UDP n'est pas fiable. Je ne vois pas un paquet recevant un accusé de réception et un mécanisme de renvoi implémenté dans votre code. Ceci est requis Vous ne pouvez pas supposer que le paquet que vous envoyez sera reçu à l'autre extrémité.

+0

Pourriez-vous fournir un exemple de code? lire aussi mon commentaire à 1844 ci-dessus – Canvas

+1

Avec une simple variable booléenne ajoutée, il n'y a plus d'interblocage :) – Canvas