Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 13.04.2019
Сообщений: 5

Отправить сообщение всем клиентам через промежуток времени

26.04.2020, 21:21. Показов 1367. Ответов 0

Студворк — интернет-сервис помощи студентам
Помогите,пожалуйста, как отправить сообщение от сервера всем клиентам (есть такой метод) через какой-либо установленный временной промежуток. Вот код:
Main: (Сервера)
Java
1
2
3
4
5
public class Main {
  public static void main(String[] args) {
    Server server = new Server();
  }
}
Server:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
 
public class Server {
  // порт, который будет прослушивать наш сервер
  static final int PORT = 3443;
  // список клиентов, которые будут подключаться к серверу
  private ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
 
  public Server() {
    // сокет клиента, это некий поток, который будет подключаться к серверу
    // по адресу и порту
    Socket clientSocket = null;
    // серверный сокет
    ServerSocket serverSocket = null;
    try {
      // создаём серверный сокет на определенном порту
      serverSocket = new ServerSocket(PORT);
      System.out.println("Сервер запущен!");
      // запускаем бесконечный цикл
      while (true) {
        // таким образом ждём подключений от сервера
        clientSocket = serverSocket.accept();
        // создаём обработчик клиента, который подключился к серверу
        // this - это наш сервер
        ClientHandler client = new ClientHandler(clientSocket, this);
        clients.add(client);
        // каждое подключение клиента обрабатываем в новом потоке
        new Thread(client).start();
      }
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
    finally {
      try {
        // закрываем подключение
        clientSocket.close();
        System.out.println("Сервер остановлен");
        serverSocket.close();
      }
      catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
         
  // отправляем сообщение всем клиентам
  public void sendMessageToAllClients(String msg) {
    for (ClientHandler o : clients) {
      o.sendMsg(msg);
    }
  }
 
 
  // удаляем клиента из коллекции при выходе из чата
  public void removeClient(ClientHandler client) {
    clients.remove(client);
  }
 
}
ClientHandler:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import com.sun.org.slf4j.internal.LoggerFactory;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.SECOND;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Logger;
 
// реализуем интерфейс Runnable, который позволяет работать с потоками
public class ClientHandler implements Runnable {
  // экземпляр нашего сервера
  private Server server;
  // исходящее сообщение
  private PrintWriter outMessage;
  // входящее собщение
  private Scanner inMessage;
  private static final String HOST = "localhost";
  private static final int PORT = 3443;
  // клиентский сокет
  private Socket clientSocket = null;
  // количество клиента в чате, статичное поле
  private static int clients_count = 0;
 
  // конструктор, который принимает клиентский сокет и сервер
  public ClientHandler(Socket socket, Server server) {
    try {
      clients_count++;
      this.server = server;
      this.clientSocket = socket;
      this.outMessage = new PrintWriter(socket.getOutputStream());
      this.inMessage = new Scanner(socket.getInputStream());
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
  // Переопределяем метод run(), который вызывается когда
  // мы вызываем new Thread(client).start();
  @Override
  public void run() {
    try {
      while (true) {
        // сервер отправляет сообщение
        server.sendMessageToAllClients("Новый участник вошёл в чат!");
        server.sendMessageToAllClients("Клиентов в чате = " + clients_count);
        break;
      }
 
      while (true) {
        // Если от клиента пришло сообщение
        if (inMessage.hasNext()) {
        String clientMessage = inMessage.nextLine();
    // если клиент отправляет данное сообщение, то цикл прерывается и 
    // клиент выходит из чата
        if (clientMessage.equalsIgnoreCase("##session##end##")) {
          break;
        }
    // выводим в консоль сообщение (для теста)
        System.out.println(clientMessage);
    // отправляем данное сообщение всем клиентам
        server.sendMessageToAllClients(clientMessage);
      }
      // останавливаем выполнение потока на 100 мс
      Thread.sleep(100);
    }
  }
  catch (InterruptedException ex) {
    ex.printStackTrace();
  }
  finally {
    this.close();
  }
}
  // отправляем сообщение
  public void sendMsg(String msg) {
      outMessage.println(msg);
      outMessage.flush();
  }
  public void SendSomeMsgInTime() {//Помогите написать код для этого метода
      //....
  }
  // клиент выходит из чата
  public void close() {
    // удаляем клиента из списка
    server.removeClient(this);
    clients_count--;
    server.sendMessageToAllClients("Клиентов в чате = " + clients_count);
  }
}
Main: (Клиента)
Java
1
2
3
4
5
public class Main {
  public static void main(String[] args) {
    ClientWindow clientWindow = new ClientWindow();
  }
}
Client:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import javax.accessibility.AccessibleContext;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
 
public class ClientWindow extends JFrame {
  // адрес сервера
  private static final String SERVER_HOST = "localhost";
  // порт
  private static final int SERVER_PORT = 3443;
  // клиентский сокет
  private Socket clientSocket;
  // входящее сообщение
  private Scanner inMessage;
  // исходящее сообщение
  private PrintWriter outMessage;
  // следующие поля отвечают за элементы формы
  private JTextField jtfMessage;
  private JTextField jtfName;
  private JTextArea jtaTextAreaMessage;
  // имя клиента
  private String clientName = "";
  // получаем имя клиента
  public String getClientName() {
    return this.clientName;
  }
 
  // конструктор
  public ClientWindow() {
    try {
      // подключаемся к серверу
      clientSocket = new Socket(SERVER_HOST, SERVER_PORT);
      inMessage = new Scanner(clientSocket.getInputStream());
      outMessage = new PrintWriter(clientSocket.getOutputStream());
    } catch (IOException e) {
      e.printStackTrace();
    }
    // Задаём настройки элементов на форме
    setBounds(600, 300, 600, 500);
    setTitle("Client");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jtaTextAreaMessage = new JTextArea();
    jtaTextAreaMessage.setEditable(false);
    jtaTextAreaMessage.setLineWrap(true);
    JScrollPane jsp = new JScrollPane(jtaTextAreaMessage);
    add(jsp, BorderLayout.CENTER);
    // label, который будет отражать количество клиентов в чате
    JLabel jlNumberOfClients = new JLabel("Количество клиентов в чате: ");
    add(jlNumberOfClients, BorderLayout.NORTH);
    JPanel bottomPanel = new JPanel(new BorderLayout());
    add(bottomPanel, BorderLayout.SOUTH);
    JButton jbSendMessage = new JButton("Отправить");
    bottomPanel.add(jbSendMessage, BorderLayout.EAST);
    jtfMessage = new JTextField("Введите ваше сообщение: ");
    bottomPanel.add(jtfMessage, BorderLayout.CENTER);
    jtfName = new JTextField("Введите ваше имя: ");
    bottomPanel.add(jtfName, BorderLayout.WEST);
    // обработчик события нажатия кнопки отправки сообщения
    jbSendMessage.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // если имя клиента, и сообщение непустые, то отправляем сообщение
        if (!jtfMessage.getText().trim().isEmpty() && !jtfName.getText().trim().isEmpty()) {
          clientName = jtfName.getText();
          sendMsg();
          // фокус на текстовое поле с сообщением
          jtfMessage.grabFocus();
        }
      }
    });
    // при фокусе поле сообщения очищается
    jtfMessage.addFocusListener(new FocusAdapter() {
      @Override
      public void focusGained(FocusEvent e) {
        jtfMessage.setText("");
      }
    });
    // при фокусе поле имя очищается
    jtfName.addFocusListener(new FocusAdapter() {
      @Override
      public void focusGained(FocusEvent e) {
        jtfName.setText("");
      }
    });
    // в отдельном потоке начинаем работу с сервером
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          // бесконечный цикл
          while (true) {
            // если есть входящее сообщение
            if (inMessage.hasNext()) {
              // считываем его
              String inMes = inMessage.nextLine();
              String clientsInChat = "Клиентов в чате = ";
              if (inMes.indexOf(clientsInChat) == 0) {
                jlNumberOfClients.setText(inMes);
              } else {
                // выводим сообщение
                jtaTextAreaMessage.append(inMes);
                // добавляем строку перехода
                jtaTextAreaMessage.append("\n");
              }
            }
          }
        } catch (Exception e) {
          }
      }
    }).start();
    // добавляем обработчик события закрытия окна клиентского приложения
    addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        super.windowClosing(e);
        try {
          // здесь проверяем, что имя клиента непустое и не равно значению по умолчанию
          if (!clientName.isEmpty() && clientName != "Введите ваше имя: ") {
            outMessage.println(clientName + " вышел из чата!");
          } else {
            outMessage.println("Участник вышел из чата, так и не представившись!");
          }
          // отправляем служебное сообщение, которое является признаком того, что клиент вышел из чата
          outMessage.println("##session##end##");
          outMessage.flush();
          outMessage.close();
          inMessage.close();
          clientSocket.close();
        } catch (IOException exc) {
 
        }
      }
    });
    // отображаем форму
    setVisible(true);
  }
 
  // отправка сообщения
  public void sendMsg() {
    // формируем сообщение для отправки на сервер
    String messageStr = jtfName.getText() + ": " + jtfMessage.getText();
    // отправляем сообщение
    outMessage.println(messageStr);
    outMessage.flush();
    jtfMessage.setText("");
  }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2020, 21:21
Ответы с готовыми решениями:

Как отправить данные всем клиентам
Есть сервер static void Main(string args) { TcpListener server = null; try { ...

Программа, которая через заданный промежуток времени с консоли выдает сообщение на экран
Требуется написать программу таймер на ассемблере, которая через заданный промежуток времени с консоли выдает сообщение на экран. Я...

Как вывести всем клиентам сообщение?
Есть класс который создает сервер package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2020, 21:21
Помогаю со студенческими работами здесь

Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам...
Есть сервер и несколько клиентов. Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам. Прошу помочь разобраться.

Через какой промежуток времени
Помогите пожалуйста с задачкой. Если можно, решение поподробнее. Материальная точка движется по окружности радиуса 1м с постоянным...

Добавления через промежуток времени
Ребят выручайте не могу разобратся как зделать!Вот у человека есть 5 кредитов к примеру он их использовал и они начинают по одному...

Изменение через промежуток времени
Нужно через 1 час после добавления в бд удалять из нее то, что добавили. Возможно ли вообще чтобы действие автоматически производилось...

Снятие атрибутов с файла через определенный промежуток времени от времени запуска bat файла
Подскажите, может есть идеи как организовать такую задачу? Есть каталог с вложенными каталогами, во вложенных каталогах периодически...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru