Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Java Client Server


Автор: Zoiberg 17.4.2010, 10:37
Добрый день. Пытаюсь написать клиент серверное приложение на 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. И я вот не могу понять почему так происходит. Возможно кто-то сможет слету ответить мне на этот вопрос?

Автор: Zoiberg 21.4.2010, 16:36
Решил простейшим казалось бы способом. После отправки сообщения необходимо сделать потоку reset. Тогда следующий объект уже отправиться с обновленной информацией.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)