2014-11-12 3 views
0

Я пытаюсь отправить UDP-пакет на компьютер в той же сети, что и мой планшет. Для этого я начал с создания класса для хранения всех необходимых мне объектов, чтобы создать сокет UDP, создать пакет и затем отправить этот пакет. Этот класс приведен ниже:Использование AyncTask для отправки UDP-пакета

public static class Session 
    { 
     public InetAddress address; 
     public DatagramSocket socket; 
     public DatagramPacket packet; 
     public String client; 
     public int port; 
     public byte[] receive_buffer; 
     public byte[] send_buffer; 
     public String message; 

     public Session (InetAddress address, DatagramSocket socket, DatagramPacket packet, 
         String client, int port, byte[] receive_buffer, byte[] send_buffer, 
         String message) 
     { 
      this.address = address; 
      this.socket = socket; 
      this.packet = packet; 
      this.client = client; 
      this.receive_buffer = receive_buffer; 
      this.send_buffer = send_buffer; 
      this.message = message; 
      this.port = port; 
     } 
    } 

Всякий раз, когда я пытаюсь отправить UDP-пакет, я начинаю с созданием объекта Session, который содержит сокет, пакет, сообщение, и несколько других вещей. У меня также есть класс Send, который я использую для отправки пакета UDP. Это показано ниже:

public static Session Send (Session session) 
    { 
     // Execute within "try" function to catch exceptions 
     try 
     { 
      /* Create address*/ 
      session.address = InetAddress.getByName(session.client); 
      /* Create socket */ 
      session.socket = new DatagramSocket(session.port); 
      /* Create packet */ 
      session.packet = new DatagramPacket(session.message.getBytes(), 
           session.message.length(), session.address, session.port); 
      /* Send packet */ 
      session.socket.send(session.packet); 
      /* Return session */ 
      return session; 
     } 
     catch (Exception e) 
     { 
      Log.e("MYAPP", "exception: " + e.getMessage()); 
      Log.e("MYAPP", "exception: " + e.toString()); 
     } 
     return null; 
    } 

Однако Отправить() не может быть вызвано непосредственно, поскольку нельзя выполнить сетевые операции в потоке пользовательского интерфейса. Чтобы исправить это, я создал AsyncTask, который вызывает Send(). Теперь все, что мне нужно сделать, это передать объект Session в AsyncTask, и он отправит пакет (теоретически). AsyncTask, что я создал показано ниже:

class sendData extends AsyncTask<UDP.Session, Void, UDP.Session> 
    { 

     /* Pre-Execute Function */ 
     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
     } 

     /* Main AsyncTask Function */ 
     @Override 
     protected UDP.Session doInBackground(UDP.Session... arguments) 
     { 
      /* Send UDP packet */ 
      UDP.Session session = UDP.Send(arguments[0]); 
      return session; 
     } 

     /* Post-Execute Function */ 
     @Override 
     protected void onPostExecute (UDP.Session session) 
     { 
      super.onPostExecute(session); 
     } 
    } 

вопрос, который я испытываю, что я не могу понять, как вернуть объект сеанса из моего AsyncTask. Очень важно, чтобы я возвращал сеанс, который я передал AsyncTask, потому что иначе сокет/порт поврежден, и я получаю исключения привязки и целую кучу других проблем при попытке отправить другой пакет. Я попытался с помощью:

UDP.Session nsession = new sendData().execute(ssession).get(); 

, но я получаю сообщение об ошибке, которое утверждает "Необработанные исключения: java.lang.InterruptedException, java.util.concurrent.ExecutionException". Поэтому мой вопрос - это лучший способ вернуть объект сеанса, который я передаю в AsyncTask, чтобы я мог использовать тот же объект сеанса в следующий раз, когда хочу отправить пакет.

ответ

1

Я был глупым и не обращал внимания на предупреждения компилятора о необработанных исключениях. Вызов AsyncTask, сделанный выше (UDP.Session nsession = new sendData().execute(ssession).get();), действительно является правильным, но его просто нужно разместить внутри оператора try/catch, чтобы уловить любые возможные исключения. Когда я сменил свой код на следующий ...

try{ 
    session = new sendData().execute(session).get();} 
catch (Exception exception){} 

... все сработало. Я могу правильно вернуть объект из AsyncTask, и мой сокет больше не повреждается, когда закончилась AsyncTask, что позволяет мне отправлять столько пакетов, сколько мне нужно.

Смежные вопросы