Добрый день. Пытаюсь написать клиент серверное приложение на Java (лабораторная работа по предмету Java) и столкнулся с такой проблемой. Попытаюсь сейчас описать как можно все подробнее. Есть GUI состоящий из двух ListBox и кнопки(ее функция отправлять введенные данные на сервер). При нажатии на кнопку я обрабатываю событие ее таким образом:
Код | String name = ""; try{ while(name.isEmpty()) name = JOptionPane.showInputDialog(mainWindow, "Введіть своє ім'я", "Авторизація", JOptionPane.QUESTION_MESSAGE); mainWindow.cModel.addElement(name); // Добавление введенной строки в ListBox1 mainWindow.sendMessage(new Message(Message.Act.ENTER,name)); mainWindow.readMessage(); }catch(NullPointerException exc){}
|
Отправка данных осуществляется путем передачи объекта класа Message у которого есть два атрибута: key - тип сообщения, value - передаваемый объект серверу.
Код | class Message implements Serializable{ static enum Act {ENTER}; Act key; Object value; Message(Act key, Object value){ this.key = key; this.value = value; } .................. }
|
Соответственно методы отправки и чтения клиента:
Код | public void sendMessage(Message msg){ try { this.oos.writeObject(msg); } catch (IOException e) { e.printStackTrace(); } }
public void readMessage(){ try { msg = (Message)ois.readObject(); switch(msg.getKey()){ case ENTER: ArrayList<Client> value = (ArrayList<Client>)msg.value; clients = value; aModel.addElement(clients.get(clients.size()-1)); break; } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
|
На сервере получение сообщения и его обработка осуществляется следующим образом:
Код | ........... port = 10240; socket = new ServerSocket(port,10,InetAddress.getLocalHost()); System.out.println("Server start"); clientSocket = socket.accept(); oos = new ObjectOutputStream(clientSocket.getOutputStream()); ois = new ObjectInputStream(clientSocket.getInputStream()); clients = new ArrayList<Client>(); while(true){ msg = (Message)ois.readObject(); switch(msg.getKey()){ case ENTER: this.updateAdmList(); break; } } .............. public void updateAdmList(){ try { // Работа ведется с обектом "Банковский клиент" и происходит заполнение его данных и добавление в общий список клиентом типа ArrayList account = new Account((int)(Math.random()*100000),(int)(Math.random()*100000)); cc = new CreditCard((int)(Math.random()*1000000), true); client = new Client(account,cc,msg.value.toString()); clients.add(client); // Записываем сформированый ArrayList в объект типа Message и отправляем его в поток msg.setValue(clients); oos.writeObject(msg); System.out.println("SERVER: Client "+clients.get(clients.size()-1).toString()+" has connected"); } catch (IOException e) { e.printStackTrace(); } }
|
ПРОБЛЕМА: При отправке сообщения серверу все происходит нормально, сервер нормально обрабатывает первую запись и нормально ее возвращает клиенту. При отправке второго сообщения на сервере все происходит как надо, а вот клиент почему-то уже не получает новый экземляр ArrayList. Тоесть при самом первом чтение сообщения клиент записывает в msg один елемент, при втором чтение сообщения клиент опять записывает в msg один елемент при то что на сервере в поток было записано 2. И я вот не могу понять почему так происходит. Возможно кто-то сможет слету ответить мне на этот вопрос?
|