Android: проблема с простой программой UDP - PullRequest
2 голосов
/ 14 ноября 2010

Я пытаюсь получить хорошее представление о UDP на Android, поэтому я пишу небольшую тестовую программу, чтобы установить 2 сокета на одном компьютере, отправить пакет и получить его. Я думал, что это будет просто, но что-то идет не так. Мой код:

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();
}

Когда я отлаживаю свой код, он переходит к последней попытке, в «client.receive(receivePacket);», но никогда не возвращается после вызова этой функции. Пакет, кажется, никогда не принимается, но мне трудно понять, почему это так.

Я надеюсь, что кто-нибудь может помочь мне решить эту проблему.

РЕДАКТИРОВАТЬ: Новый код с использованием потоков. Вызов «получить» перед фактической отправкой пакета. Попытка использовать 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();
        }
    } 
}

Все еще с той же проблемой, он останавливается и ждет при получении, и ничего не происходит.

Большое спасибо,

Jary

1 Ответ

1 голос
/ 14 ноября 2010

Я думаю, что вы отправляете пакет, пока получатель еще не прослушивает.

Попробуйте сначала client.receive(..), а затем server.send(..). Таким образом client будет прослушивать входящие пакеты. Конечно, вам придется запустить это в двух разных потоках.

...