2010-11-13 5 views
2

J'essaie d'avoir une bonne compréhension de UDP sur Android, donc j'écris un petit programme de test pour installer 2 sockets sur la même machine, envoyer un paquet et le recevoir. Je pensais que ce serait simple, mais quelque chose ne va pas. Mon code est:Android: problème avec le programme simple UDP

DatagramSocket server; 
DatagramSocket client; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Initialize a client socket and a server socket using UDP 
    try { 
    server = new DatagramSocket(); 
    client = new DatagramSocket(); 
} catch (SocketException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

// Server will now send some data 
    String data = "This is a test"; 
    DatagramPacket sendPacket = new DatagramPacket(data.getBytes(), data.length(), 
     client.getInetAddress(), client.getLocalPort()); 
    try { 
    server.send(sendPacket); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    // Client has to receive and read the data 
    byte[] buf = new byte[1024]; 
    DatagramPacket receivePacket = new DatagramPacket(buf, buf.length); 
    try { 
    client.receive(receivePacket); 
    byte[] receivedData = receivePacket.getData(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    server.disconnect(); 
    client.disconnect(); 
} 

Quand je déboguer mon code, il va dans le dernier essai, dans « client.receive(receivePacket); » mais il ne revient jamais de cet appel de fonction. Le paquet semble ne jamais être reçu, mais j'ai du mal à trouver pourquoi.

J'espère que quelqu'un pourrait m'aider s'il vous plaît à résoudre ce problème.

EDIT: Nouveau code utilisant des threads. Appelez "recieve" avant d'envoyer le paquet. Essayer d'utiliser AsyncTask.

public class udpexample extends Activity { 

    DatagramSocket server; 
    DatagramSocket client; 

    String data = "This is a test"; 

    private static final String TAG = "UDPExampleActivity"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.i(TAG, "Starting"); 

     // Initialize a client socket and a server socket using UDP 
     try { 
      server = new DatagramSocket(); 
      client = new DatagramSocket(); 
     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     new ReceivePacket().execute(); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     // Server will now send some data 
     DatagramPacket sendPacket = new DatagramPacket(data.getBytes(), data.length(), 
       client.getInetAddress(), client.getLocalPort()); 
     try { 
      Log.i(TAG, "About to send"); 
      server.send(sendPacket); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private class ReceivePacket extends AsyncTask<Void, Void, Void> { 
     // Thread used to receive a packet 

     @Override 
     protected Void doInBackground(Void... params) { 
      // Client has to receive and read the data 
      byte[] buf = new byte[1024];    
      DatagramPacket receivePacket = new DatagramPacket(buf, buf.length); 
      try { 
       Log.i(TAG, "About to receive"); 
       client.receive(receivePacket); 
       byte[] receivedData = receivePacket.getData(); 

       // Verify that the packet is identical to the one being sent 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     protected void onPostExecute(Void result) { 
      server.disconnect(); 
      client.disconnect(); 
     } 
    } 
} 

Toujours avec le même problème, il s'arrête et attend la réception et rien ne se passe.

Merci beaucoup,

Jary

Répondre

1

Je pense que vous envoyez un paquet alors que le récepteur n'est pas encore à l'écoute. Essayez d'abord client.receive(..) puis server.send(..). De cette façon, client sera à l'écoute des paquets entrants. Bien sûr, vous devrez exécuter cela dans deux threads différents.

+0

Merci beaucoup. Cela semble être une très bonne prise. Malheureusement, cela ne semble pas fonctionner avec la façon dont je l'ai implémenté avec des threads. Je suis en train de mettre à jour le code. Merci. – Jary

+0

Sur Android, vous devez toujours utiliser AsyncTask lors de l'exécution de tâches de longue durée ou de blocage: http://developer.android.com/reference/android/os/AsyncTask.html –

+0

Étendez AsyncTask et placez votre code de réception dans doInBackground (..) 'méthode. –