Как заставить ObjectInputStream вызывать reset () и flu sh () для работы в Android - PullRequest
0 голосов
/ 31 марта 2020

В приведенном ниже коде я пытаюсь создать многоадресный сервер, который отправляет объект ProtocolPackage клиенту. Сервер отправляет ProtocolPackage с событием SERVER_AVAILABLE до тех пор, пока он работает, и должен отправить одно событие SERVER_UNAVAILABLE, как только сервер настроен на остановку.

Однако сервер никогда не будет отправляет клиенту событие «сервер недоступен», поэтому я добавил тестовый блок сразу после отправки пакета, и, конечно же, всегда получается, что событие «сервер доступен». Сначала у меня не было вызовов reset() и flush() после вывода каждого потока объекта, но потом я прочитал о том, как вызовы должны отправлять обновленную версию объекта, а не ссылку на первую. Я тестировал с использованием вызовов reset() и flush() с похожим кодом в Eclipse, и он работал там, но по некоторым причинам не работал в Android.

Я смог заставить код работать, имея ByteArrayOutputStream и ObjectInputStream объекты локальные и реинициализируются каждый l oop, но я пытаюсь заставить это работать с объектами, являющимися полями класса. Как я могу это сделать?

(журналы исключений для простоты опущены)

public class MulticastServer extends Thread {

    private InetAddress mGroup;
    private DatagramSocket mSocket;

    private ByteArrayOutputStream mByteArrayOS;
    private ObjectOutputStream mObjectOS;

    private boolean mRunning = true;
    private volatile ProtocolPackage mProtocolPackage;

    public MulticastServer(ProtocolPackage pProtocolPackage) {
        mProtocolPackage = pProtocolPackage;
        try {
            mGroup = InetAddress.getByName("230.0.0.1");
            mSocket = new DatagramSocket(51000);
            mByteArrayOS = new ByteArrayOutputStream(6400);
            mObjectOS = new ObjectOutputStream(mByteArrayOS);
        } catch (IOException e) {
        }
    }

    @Override
    public void run() {
        while (mRunning) {
            //> Periodic event send
            try {
                mObjectOS.writeObject(mProtocolPackage);
                byte[] buf = mByteArrayOS.toByteArray();
                DatagramPacket packet = new DatagramPacket(buf, buf.length, mGroup, 51001);
                mSocket.send(packet);
                mObjectOS.reset();
                mObjectOS.flush();
                Thread.sleep(1000);
            } catch (IOException | InterruptedException e) {
                break;
            }
        }

        //> Final event send
        try {
            mObjectOS.writeObject(new ProtocolPackage(Protocol.Event.SERVER_UNAVAILABLE, mProtocolPackage.getData()));
            byte[] buf = mByteArrayOS.toByteArray();
            DatagramPacket packet = new DatagramPacket(buf, buf.length, mGroup, 51001);
            mSocket.send(packet);

            //> Test block to check event of last object sent through packet
            ProtocolPackage protocolPackage;
            try (
                    ByteArrayInputStream byteArrayIS = new ByteArrayInputStream(buf);
                    ObjectInputStream objectIS = new ObjectInputStream(byteArrayIS);
            ) {
                protocolPackage = (ProtocolPackage)objectIS.readObject();
                Debug.d("Event: "+protocolPackage.getEvent().toString()); //> Outputs "Event: SERVER_AVAILABLE" even though the intended output is "Event: SERVER_UNAVAILABLE"
            } catch (IOException | ClassNotFoundException e) {
            }
        } catch (IOException e) {
        }

        try {
            mObjectOS.close();
        } catch (IOException e) {
        }

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