Program działa na takiej zasadzie. Klient podłącza się do serwera i to działa ok:
U klienta klikamy na przycisk użytkownicy i tworzy się nowy JPanel, który wywołuje metodę
usersList();
z klasy receiver.
public class UsersJPanel extends JPanel {
private static final long serialVersionUID = 1L;
private List<User> usersList;
private ClientJFrame cf;
public UsersJPanel(ClientJFrame cf) {
this.cf = cf;
setLayout(null);
setBounds(200, 150, 694, 472);
refresh();
}
public void refresh() {
usersList = cf.getRec().usersList();
/*Rysowanie tabeli i przycisko */
}
Metoda usersList z klasy receiver wysyła zadanie czyli "Lista uzytkownikow" oraz obiekt, w tym przypadku nullObject bo nic nie wysyłamy do serwera.
synchronized public List<User> usersList() {
writer.println("Lista uzytkownikow");
writer.flush();
System.out.println();
try {
NullObject ol = new NullObject();
oos.writeObject(ol);
oos.flush();
System.out.println();
ReplyUsersList rul = (ReplyUsersList) ois.readObject();
System.out.println();
if (rul.getText() != null) {
JOptionPane.showMessageDialog(null, rul.getText(), "Błąd",
JOptionPane.ERROR_MESSAGE);
}
return rul.getUsersList();
} catch (IOException e) {
JOptionPane
.showMessageDialog(
null,
"Wystąpił błąd podczas pobierania danych: "
+ e.getMessage(), "Bład",
JOptionPane.ERROR_MESSAGE);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null,
"Wystąpił błąd podczas pobierania danych: ", "Bład",
JOptionPane.ERROR_MESSAGE);
}
return null;
}
W tym czasie na serwer czeka na wiadomość od klienta
public void run() {
ObjectInputStream ois = null;
BufferedReader reader = null;
ObjectOutputStream oos = null;
PrintWriter writer = null;
String command;
initalizeAction();
try {
writer = new PrintWriter(socket.getOutputStream());
oos = new ObjectOutputStream(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
ois = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
while((command = reader.readLine()) != null) {
System.out.println(command);
SendObjectInterface soi = (SendObjectInterface) ois.readObject();
actionMap.get(command).action(soi, oos);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Błąd podczas odbioru wiadomości: " + e.getMessage(),
"Błąd", JOptionPane.ERROR_MESSAGE);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null,
"Błąd podczas odbioru wiadomości: " + e.getMessage(),
"Błąd", JOptionPane.ERROR_MESSAGE);
} finally {
try {
ois.close();
oos.close();
reader.close();
writer.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Błąd podczas zamykania strumienia: " + e.getMessage(),
"Błąd", JOptionPane.ERROR_MESSAGE);
}
}
}
W pętli while odbiera komendę co ma zrobić i obiekt. Po czym wywołuje odpowiednią metodę z klasy, w tym przypadku UsersListAction
@Override
synchronized public void action(SendObjectInterface soi, ObjectOutputStream oos) {
String sql = "Select * from users";
ReplyUsersList rul = new ReplyUsersList();
try {
db = Database.getDB();
sta = db.getCon().prepareStatement(sql);
rs = sta.executeQuery();
while (rs.next()) {
rul.getUsersList().add(
new User(rs.getInt(1), rs.getString(2),
rs.getString(3), rs.getString(4)));
}
oos.writeObject(rul);
oos.flush();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Blad sql " + e.getMessage(),
"Błąd", JOptionPane.ERROR_MESSAGE);
rul.setText("Błąd pobierania danych z serwera");
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Blad wysyłania wiadomości na serwer" + e.getMessage(),
"Błąd", JOptionPane.ERROR_MESSAGE);
}
}
Metoda wypełnia obiekt z listą użytkowników i wysyła do serwera, wtedy w klasie receiver powinno to być odebebrane:
ReplyUsersList rul = (ReplyUsersList) ois.readObject();
Klikam kilkakrotnie przycisk użytkownicy i wszystko ok, tylko po paru razach się zwiesza. Zauważyłem, że problem znajduje się tutaj:
while((command = reader.readLine()) != null) {
System.out.println(command);
SendObjectInterface soi = (SendObjectInterface) ois.readObject();
actionMap.get(command).action(soi, oos);
}
Serwer odczytuje komendę a potem obiekt, ale po paru razach komenda jest odczytywana a obiekt już nie i się zawiesza.