java - 在 AsyncTask 中通过套接字接收两个不同的数组

标签 java sockets android-asynctask

我有一个用于小型多人游戏的 Java 服务器。当关键字 update 到达时,我想通过连接的套接字向客户端发送两个不同的数组。

output.reset();
output.writeObject(array1);
output.writeObject(array2);

其中 array1 为 int[16],array2 为 int[2][2]

在 Android 客户端中,我有两个 AsyncTask 用于捕获数组。

@Override
protected int[] doInBackground(ObjectInputStream...params) {
    ObjectInputStream ois = params[0];

            try {
                arrayFromServer = (int[]) (ois.readObject());
            } catch (ClassNotFoundException | IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   

        return arrayFromServer;
}

@Override
protected int[][] doInBackground(ObjectInputStream... params) {
    ObjectInputStream ois = params[0];

        try {
            complexArrayFromServer = (int[][]) (ois.readObject());
        } catch (ClassNotFoundException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    return complexArrayFromServer;
}

我将它们传递给我的 UI Activity ,就像这样,使用计时器每 20 秒发送一次关键字更新

    public void startTimer() {
    timer = new Timer();
    initializeTimerTask();
    timer.schedule(timerTask, 5000, 20000); 
}

public void initializeTimerTask() {

    timerTask = new TimerTask() {
        public void run() {

            handler.post(new Runnable() {
                public void run() {

                    //AsyncTask
                    new CardTask() {

                        @Override
                        public void onPostExecute(int[] result) {
                            mFromServer = result;
                        }
                    }.execute(ois);

                    //AsyncTask
                    new PointsAndCardsTask() {

                        @Override
                        public void onPostExecute(int[][] result) {
                            mComplexArray = result;

                        }
                    }.execute(ois);
                }
            });
        }
    };
}

但这给我的游戏带来了一些问题,我很想知道我在发送数组时是否做错了什么,或者有更好的方法吗?

我收到的错误是

08-17 15:39:57.196: E/AndroidRuntime(665): FATAL EXCEPTION: main
08-17 15:39:57.196: E/AndroidRuntime(665): java.lang.ArrayIndexOutOfBoundsException

因为当我期待一个数组时,我得到了另一个数组。

最佳答案

我无法解释 Java 当(反)序列化此类数组时会发生什么,但我确信 Java 无法区分数组,因此您无法确保只获取具有所需维度的数组。

我会将您发送的数据封装在不同的 Java 对象中。通过这样做,您可以使用实例来确保您只得到您想要的!

关于java - 在 AsyncTask 中通过套接字接收两个不同的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055671/

相关文章:

android - 在 AsyncTask 中获取 IndexOutOfBoundException

android - 用于登录 Activity 的 IntentService 与 AsyncTask?

java - 链表的多项式乘法度数数学不正确

node.js - Node Socket.io客户端连接后认为已断开连接

c# 在另一个位图上绘制位图

使用 UDP 的 Java 套接字编程

java - 从 Java 使用表类型参数调用 OracleDB 过程——DB 总是接收空值而不是值

java - 轴2 : content length must be specified

java - 在 ServletContextListener 中处理 Java 异常的首选方法

android - OnePlus 5 无法通过 audiomanager 在通话模式下启动扬声器