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


Автор: Alexey89 22.6.2016, 16:54
Пытаюсь сделать клиент серверное приложение отпрака сообщений с помощью ObjectOutputStream и ObjectInputStream.

//Клиент
Код

package ClientServer;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.plaf.metal.MetalBorders.TextFieldBorder;


public class Client extends JFrame {

    private static JTextArea textArea = new JTextArea();
    private JTextField tf = new JTextField(10);
    private JButton b1 = new JButton("Старт");
    private JButton b2 = new JButton("Отправить");
    String username = "";
    Socket s;
    
    
    public Client()
    {
        Container contentPane = getContentPane();
        contentPane.setLayout(null);
        JPanel col = new JPanel();
        col.setBounds(10, 10, 100, 120);
        col.setLayout(new GridLayout(4,1,0,8));
        contentPane.add(col, BorderLayout.EAST);
        
        textArea.setBounds(130,10,100,500);
        textArea.setBorder(new TextFieldBorder());
        textArea.setFont(new Font("Counter New", Font.PLAIN,12));
        contentPane.add(textArea);
        col.add(tf);
        
        b1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource()==b1)
                {
                    new ServerThread();
                }
                
            }
            
        });
        b2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource()==b2)
                {
                    try {
                        textArea.append("");
                        username = tf.getText();
                        
                        s = new Socket(InetAddress.getLocalHost(), 1111);
                    
                        
                        
                        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                        oos.writeObject(username);
                        
                    //    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
                    //    String response = (String) ois.readObject();
                        
                        
                    }catch (Exception ex) {
                        // TODO Auto-generated catch block
                        ex.printStackTrace();
                    }  
                    Thread IncomingReader = new Thread(new IncomingReader());
                    IncomingReader.start();
                }
                
            }
        });
        col.add(b1);
        col.add(b2);
        
    }
    public static void main(String[] args) {
        Client frame = new Client();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(200,100,280,400);
        //frame.start();
        frame.setVisible(true);
        frame.setResizable(false);

    }

     public class IncomingReader implements Runnable
     {

        @Override
        public void run() {
            while(true)
            {
                try {
                    
                    ObjectInputStream br = new ObjectInputStream(s.getInputStream());
                    ArrayList<String> list_data = (ArrayList<String>) br.readObject();
                    for (int i = 0; i < list_data.size(); i++)
                    {
                        String response = list_data.get(i);
                        textArea.append(response+"\n");
                        
                    }
                    
                    
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
         
     }
    

}



//Сервер
Код

package ClientServer;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ServerThread {
    private InetAddress addr;
    public static ArrayList<Socket> ConnectionArray = new ArrayList<Socket>();
    public static ArrayList<String> CurrentUsers = new ArrayList<String>();
    
    public ServerThread()
    {
        Thread starter = new Thread(new ServerStart());
        starter.start();
    }
    
    public class ServerStart implements Runnable 
    {

        @Override
        public void run() {
            try {
                System.out.println("initialized");
                ServerSocket serv = new ServerSocket(1111);
                while(true)
                {
                    Socket sock = serv.accept();
                    addr = sock.getInetAddress();
                    
                    ConnectionArray.add(sock);
                    
                    ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
                    String response = (String) ois.readObject();
                    
                    CurrentUsers.add(response);
                    
                    for(int i = 0; i<ConnectionArray.size(); i++)
                    {
                        ObjectOutputStream oos = new ObjectOutputStream(ConnectionArray.get(i).getOutputStream());
                        oos.writeObject(CurrentUsers);
                        //CurrentUsers.remove(i);
                        oos.flush(); 
                    }
                    //ConnectionArray.remove(sock); 
                    
                }
            }catch (IOException e){
                System.out.println("Disconnect");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                System.out.println("Disconnect");
            }
            
        }
        
    }
}



В итоге сообщение отправляются, но коллекции куда сохраняются сообщения дублируются. Например ввел одно сообщение оно отобразилось. Ввел другое сообщение, отобразилось 
сразу два сообщения за предыдущем сообщением. Все сообщения отображаются в текстовом поле. Дальше когда слишком много вводишь сообщений происходит разрыв соединения и
  отправлять сообщения больше нельзя. Разрыв соединения происходит где try catch на сервере и выводит сообщение в консоле Disconnect. Как исправить эти проблемы?

Автор: LSD 23.6.2016, 12:28
1. Переменные в Java называются с маленькой буквы. С большой пишут имена классов.
2. Ты каждый раз добавляешь в CurrentUsers новое сообщение и отсылаешь весь CurrentUsers целиком. Или отсылай только новое или полностью перерисовывай список.
3. У тебя логически неправильно написан сервер. Он принимает клиентское соединение, отсылает туда одно сообщение, а дальше ничего с ним не делает, ждет новый коннект.

Автор: Alexey89 26.6.2016, 23:22
Что-то не как не могу сообразить можете каждый пункт объяснить, что вы имели ввиду желательно с примером и кодом или же предоставить ссылку на похожий пример?

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