Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент серверное приложение отправка сообщений 
:(
    Опции темы
Alexey89
Дата 22.6.2016, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 24.7.2015

Репутация: нет
Всего: нет



Пытаюсь сделать клиент серверное приложение отпрака сообщений с помощью 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. Как исправить эти проблемы?
PM MAIL   Вверх
LSD
Дата 23.6.2016, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 19
Всего: 537



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Alexey89
Дата 26.6.2016, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 24.7.2015

Репутация: нет
Всего: нет



Что-то не как не могу сообразить можете каждый пункт объяснить, что вы имели ввиду желательно с примером и кодом или же предоставить ссылку на похожий пример?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1081 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.