Witam
piszę w celach szkoleniowych dość złożoną apkę w Javie 7 i utknąłem w miejscu, gdzie w ramach komunikacji klient-serwer (localhost) użytkownik jako jedną z opcji menu (wyświetlanego w pętli while i obsługiwanego mechanizmem switcha) prosi serwer o przesłanie listy zserializowanych osób, a klient je odbierze i wyświetli. Wyświetlanie robię w pętli - nie wpadłem na razie na prostszy pomysł. Próbowałem z 10 rozwiązań, ale: albo nie wyświetla niczego, albo wyświetla, co trzeba (czyli komunikacja jest ok) i przeskakuje do następnego case'a zamiast znowu pokazać menu. W innych caseach bez pętli nie problemu. Uproszczony kod jest taki (całość zajęłaby za dużo placu):
public class Serwer {
ServerSocket providerSocket;
//deklaracja referencji do strumieni
void run() throws IOException, ClassNotFoundException {
try {
initialise(); //funkcja tworzy testowo dwa obiekty klasy Person, działa dobrze for sure
//utworzenie ServerSocketa
while (true) {
//inicjalizacja strumieni, stworzenie zwykłego Socketa metodą accept(),odebranie opcji od klienta
switch(opcjaOdKlienta)
{
case 1:
System.out.println("Server should now send list of persons:");
for (Person p : InnaKlasa.zbiórOfPersons.getPerson()) {
oos.writeObject(p); //oos to obiekt ObjectOutputStream
}
break;
case 2:
// nieistotne do końca
Klasa klient,w której jest problem, wygląda tak:
public class Klient {
Socket requestSocket;
ObjectInputStream ois =null;
void run() throws ClassNotFoundException,IOException {
int choice = 0;
while (choice != 4) {
//inicjalizacja strumieni
//wyswietlenie menu i pobranie opcji od usera
switch (choice) {
case 1:
dos.writeInt(1); //wysyła serwerowi polecenie przesłania obiektów Person
Person pp;
while(true) {
try{
System.out.println("Starting iteration");
pp =(Person) ois.readObject();
//if (pp==null) {ois.close(); System.out.println("Encountered pp==null..."); break; }
System.out.println(pp);
}
catch (EOFException eof) {
ois.close();
System.err.println("Entering catch block");
break ;
}
}//koniec pętli while w casie
break;
case 2:
...
W takiej wersji program wyświetla dwie Person i wisi na "Starting iteration", próbowałem jakoś zamknąć strumień przez try-finally,ale nawet nie wchodził do bloku finally (a pisali, że zawsze sie wykona:P ). Wygląda na to, że strumień głupieje, kiedy wczytał wszystkie obiekty i nie mam pojęcia, co z tym zrobić (próbowałem pętlą for z tyloma iteracjami, ile ejst Persons, ale wtedy nie wyświetla niczego(?!) ). Warunek if(pp == null) też nic nie daje.
Byłby ktoś w stanie mnie poratować pseudokodem, w jaki sposób mogę obsłużyć wyświetlanie wszystkich obiektów i powrót do menu? Da się to w ogóle zrobić prościej niż zapisywać Persons do pliku i czytać stamtąd (o ile to by zadziałało?)