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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опрос сервера по таймеру 
:(
    Опции темы
enzaime
Дата 17.3.2014, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне хочется сделать историю для чата, но как-то с первого раза самому не вышло. Ситуация такая: есть сервер, есть много клиентов (например штук 10) с ними со всеми сервер поддерживает соединение. Кто-то из клиентов отправляет сообщение на сервер, сервер сохраняет сообщение в историю и рассылает историю(ну или часть её) всем клиентам. Но сервер может послать сообщение клиенту только после того как клиент что-то прислал (я это так понимаю, поправьте если неверно), вот и получается, что клиенты должны постоянно отсылать проверочные запросы серверу (мол вдруг что поменялось), если есть изменения, то клиенты получают это изменения (новые сообщения из истории).  Я так понимаю на стороне клиента создается поток, который отправляет проверочные сигналы серверу (параллельно с сообщениями от этого клиента). Если это так, то мог бы кто-нибудь написать пример этого потока, т.е. что в нём должно быть и когда должен объявляться.
Мои мысли:
Код

        Thread t=new Thread(new Runnable() {
            
            @Override
            public void run() {
                out.write(/*something*/);
                String history=in.read();
            }
        });


Сам чат:
Код

public class Server {
    static String history="";
    static ArrayList<User> users=new ArrayList<>();
    static Connection conn = null;
    public static void send(String input)
    {
       for(int i=0;i<users.size();i++)users.get(i).send();
    }
    public static void main(String[] args) {
        
        ServerSocket s=null;
        try{
            int i=0;
             s=new ServerSocket(8189);
            System.out.println("Server is started");
            while(true)
            {    
                User u=new User(i,s.accept());
                u.start();
                users.add(u);
                i++;
                System.out.println(i);
            }
        }
        catch(IOException e)
        {
            System.out.println("init error: "+e);
        }
        finally
        {
            if(s!=null)
                {
                try {
                    s.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
              }
        
    }
}

Код

public class User extends Thread{
    Socket s;
    int num;
     InputStream is;
     OutputStream os;    
     BufferedReader br;
     PrintWriter out;
     int count=0;
    public User(int i,Socket s)
    {
        num=i;
        this.s=s;
    }
       public void run() {
           try {

               BufferedReader in = new BufferedReader(
                       new InputStreamReader(s.getInputStream()));
                out = new PrintWriter(s.getOutputStream(), true);

               out.println("Hello, you are client #" + num + ".");
               out.println("Enter a line with only a period to quit\n");

               while (true) {
                   String input = in.readLine();
                   Server.history=Server.history+" "+input;
                   if (input == null || input.equals(".")) {
                       break;
                   }  
                   Server.send();
               }
           } catch (IOException e) {
               log("Error handling client# " + num + ": " + e);
           } finally {
               try {
                   s.close();
               } catch (IOException e) {
                   log("Couldn't close a socket, what's going on?");
               }
               log("Connection with client# " + num + " closed");
           }
       }

       private void log(String message) {
           System.out.println(message);
       }
       public void send()
       {
        out.println(Server.history);
       }
}


Клиент
Код

public class Klient {
    public static void main(String[] args) {
            new SwingView();
    }
}

Код

public class SwingView {
    JButton send;
    JButton connect;
    JTextArea server;
    JTextField message;
    JFrame frame;
    JTextArea history;
    private BufferedReader in;
    private PrintWriter out;
    public SwingView()
    {
        frame=new JFrame("клиент");
        send=new JButton("отправить");
        connect=new JButton("соединение");
        server=new JTextArea("127.0.0.1/8189");
        message=new JTextField("сообщение");
        history=new JTextArea();
        frame.setSize(400,400);
        JPanel panel=new JPanel();
        panel.setLayout(new GridLayout(2, 2));
        panel.add(server);
        panel.add(connect);
        panel.add(message);
        panel.add(send);
        Box box=new Box(BoxLayout.Y_AXIS);
        box.add(panel);
        box.add(history);
        frame.add(box,BorderLayout.NORTH);
        
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        connect.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                super.mousePressed(e);
                start();
            }
        });
        send.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                send();
            }
        });
    }
    public void start() {
        try {
            Socket s = new Socket(getHost(), getPort());
            in = new BufferedReader(
                    new InputStreamReader(s.getInputStream()));
            out = new PrintWriter(s.getOutputStream(), true);
            for (int i = 0; i < 3; i++) {
                System.out.println(in.readLine() + "\n");
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }  
    }
    public void send()
    {
        out.println(message.getText());
        String response;
     try {
         response = in.readLine();
         if (response == null || response.equals("")) {
               System.exit(0);
           }
     } catch (IOException ex) {
            response = "Error: " + ex;
     }
     history.setText(response);
     message.selectAll();
    }
    public int getPort()
    {
        String p=server.getText();
        int port=Integer.parseInt(p.substring(p.indexOf("/")+1, p.length()));
        return port;
    }
    public String getHost()
    {
        String p=server.getText();
        return p.substring(0,p.indexOf("/"));
    }

}

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

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

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


 




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


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

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