簡體   English   中英

使用AyncTask發送UDP數據包

[英]Using AyncTask to send a UDP packet

我正在嘗試將UDP數據包發送到與平板電腦位於同一網絡上的計算機。 為此,我首先建立一個類來容納創建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;
    }

但是,由於不能在UI線程上執行網絡操作,因此無法直接調用Send()。 為了解決這個問題,我創建了一個調用Send()的AsyncTask。 現在,我要做的就是將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的會話對象的最佳方法是什么,以便下次我想發送數據包時可以使用該會話對象。

我很傻,沒有注意關於未處理異常的編譯器警告。 上面進行的AsyncTask調用( UDP.Session nsession = new sendData().execute(ssession).get(); )確實是正確的,但是只需要將其放置在try / catch語句中即可捕獲任何可能的異常。 當我將代碼更改為以下內容時...

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

...一切正常。 我能夠從AsyncTask中正確返回一個對象,並且當AsyncTask完成時,我的套接字也不再損壞,從而允許我發送任意數量的數據包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM