Пытаюсь сделать клиент серверное приложение отпрака сообщений с помощью 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. Как исправить эти проблемы? |