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
|