Я пытаюсь отправить 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, чтобы я мог использовать тот же объект сеанса в следующий раз, когда хочу отправить пакет.