Ситуация: Клиент отправляет объект на сервер с помощью ObjectOutputStream. I сброс() и сброс() после отправки.Android: объект не получен должным образом с использованием ObjectOutputstream & ObjectInputstream
Сервер принимает и объект, выполняет некоторую обработку и отправляет его обратно клиенту. Сразу же после отправки я вызываю ObjectOutputStream.reset(). Перед отправкой я также распечатаю поле в этом объекте в консоли.
Клиент получает тот же объект обратно с сервера, используя ObjectInputStream().
Задача: После получения объекта обратно у клиента поле, напечатанное на консоли сервера, теперь печатает NULL.
То, что я пробовал: Я использую flush() и reset() после отправки и получения с обоих концов.
Почему полученный объект поврежден?
Клиентский код - беги() ниток: Код
objectOutputStream.flush();
objectOutputStream.reset();
//out.println("#SerialO#");
objectOutputStream.writeBoolean(true);
if(((Dodger) this.obj).getRemotable()){
Log.i("ENDPOINT", "Sending Serialized ObjecInstance ...");
objectOutputStream.writeObject(this.obj);
objectOutputStream.flush();
objectOutputStream.reset();
}
Client - Функция называется TO получить сервера O/P
objectOutputStream.writeBoolean(false);
objectOutputStream.flush();
objectOutputStream.reset();
objectOutputStream.writeObject(args);
objectOutputStream.flush();
objectOutputStream.reset();
res = objectInputStream.readObject();
......
else if (res instanceof Dodger)
{
res = (Dodger) res;
res3 = (Dodger)res;
Log.v("CLIENT", "Object received Dodger "+ctr);
}
else
if(res==null)
Log.v("CLIENT", "Object received is NULL "+ctr);
else
Log.v("CLIENT", "Object received of UNKNOWN Type "+ctr);
catch (Exception e)
{
Log.e("CLIENT receive error 3",e.toString());
}
// ** ERROR COMES AT THIS LINE. NULL VALUE IS PRINTED **
System.out.println("ENDPOINT GETPOSITION -> "+res3.getPosition());
код сервера - основной поток.
flg = mInput.readBoolean();//this.input.readLine().toString();
System.out.println("SERVER Received flg as "+flg);
if(flg){
Log.d("SERVER","Received an object");
sendObj = mInput.readObject();
//mOutput.flush();
CommunicationThread commThread = new CommunicationThread(this.clientSocket,it,sendObj);
new Thread(commThread).start();
}
else //if(flg.equalsIgnoreCase("P"))
{
Object[] recArgs = (Object[])mInput.readObject();
executor = Executors.newFixedThreadPool(1);
executor.submit(new updateUIThread(this.clientSocket, this.msg, recArgs));
//Temp
//executor.execute(new updateUIThread(this.clientSocket, this.msg, recArgs));
//break;
}
код сервера - Сообщение Тема: Код
if (mInput==null){
Log.i("SERVER","Receiving very first serialized obj");
mOutput = new ObjectOutputStream(this.clientSocket.getOutputStream());
System.out.println("Inside Server's Comm Thread 2 ");
mInput = new ObjectInputStream(new BufferedInputStream(this.clientSocket.getInputStream()));
}
{
System.out.println("Inside Server's Comm Thread 3 ");
if (obj instanceof Dodger) {
obj1 = (Dodger)obj;
//...
System.out.println("Dodger Object Type: " + obj.getClass().getName());
}
else {
System.out.println("Unexpected object type: " + obj.getClass().getName());
}
Сервер - updateUIThread:
obj1.setPosition((Vec2)this.recArgs[0]);
// BELOW IT PRINTS THE PROPER VALUE, BEFORE SENDING BACK TO CLIENT
System.out.println("SERVER GETPOSITION "+obj1.getPosition());
mOutput.reset();
mOutput.writeObject(obj1);
mOutput.reset();
отправьте ваш код пожалуйста – suitianshi
@suitianshi, сделано. Надеюсь, он не слишком длинный, чтобы понять. – Abhishek
Изменен код еще раз. Может ли кто-нибудь предложить решения? – Abhishek