В приведенном ниже коде я пытаюсь создать многоадресный сервер, который отправляет объект 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();
}
}