Я пытаюсь отправить объекты с клиента на сервер через сокеты в 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 ()