Android Sockets - вылетает приложение после чтения объекта из Stream - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь отправить объекты с клиента на сервер через сокеты в Android (Java). Но приложение (SERVER) вылетает, как только объект получен от Клиента. Мой код на стороне клиента прослушивает события касания, и на основе этих событий касания конкретный объект (Action) передается на ObjectOutputStream, но как только я помещаю палец на экран на стороне клиента, событие касания срабатывает и объект Action отправляется в потоке, и сервер падает при получении этого объекта.

Код серверной стороны

 @Override
        protected Void doInBackground(Void... voids) {
            ObjectInputStream stream;

            try{
                server = new ServerSocket(3107);
                socket = server.accept();
                stream = new ObjectInputStream(socket.getInputStream());
                publishProgress(new Action(0,0,CONNECTED)); /*TO KNOW IF CLIENT HAS CONNECTED*/

                while(true)
                {
                    i++;
                    if(isCancelled()){
                        break;
                    }
                    action = (Action)stream.readObject();
                    publishProgress(action);
                }
            }catch (Exception exception)
            {
                exception.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Action... actions) {
            super.onProgressUpdate(actions);
            if(actions[0].type==CONNECTED)
            {
                Toast.makeText(MainActivity.getContext(),"CONNECTED",Toast.LENGTH_SHORT).show();
            }
            MainActivity.context.MyCustomDrawingView.draw(actions[0]);
        }

Код на стороне клиента

@Override
        public boolean onTouchEvent(MotionEvent event) {
            final float x = event.getX();
            final float y = event.getY();
            final int ACTION;

                switch (ACTION = event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        touch_start(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        touch_move(x, y);
                        invalidate();
                        break;
                    case MotionEvent.ACTION_UP:
                        touch_up();
                        invalidate();
                        break;
                }

                    Thread thread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                            try {
                                stream.writeObject(new Action(x, y, ACTION));
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    thread.start();
            return true;
        }
    }

LOGCAT (Ошибка)

09-02 18:59:52.426 29234-29234/? E/Zygote: isWhitelistProcess - Process is Whitelisted
09-02 19:00:08.958 29234-29234/com.nitishprajapati.server_b E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nitishprajapati.server_b, PID: 29234
    java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.ObjectInputStream.close()' on a null object reference
        at com.nitishprajapati.server_b.MainActivity$ServerTask.onPostExecute(MainActivity.java:252)
        at com.nitishprajapati.server_b.MainActivity$ServerTask.onPostExecute(MainActivity.java:185)
        at android.os.AsyncTask.finish(AsyncTask.java:695)
        at android.os.AsyncTask.-wrap1(Unknown Source:0)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

EDIT: Хорошо, теперь приложение не падает. Проблема была в том, что у меня было две переменные с именем stream. Один в doInBackground() и один в теле AsyncTask. Путаница с переменной вызывала исключение NullPointerException. Но теперь есть другая проблема, сервер непосредственно выполняет onPostExecute (), когда я выполняю сенсорное событие на клиенте. Это означает, что он break отключен от doInBackground ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...