-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServer.java
More file actions
101 lines (91 loc) · 3.33 KB
/
Copy pathServer.java
File metadata and controls
101 lines (91 loc) · 3.33 KB
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
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.*;
public class Server {
private Vector<ClientHandler> clients;
private AuthService authService;
private static final Logger logger = Logger.getLogger(Server.class.getName());
public AuthService getAuthService() {
return authService;
}
public Server() {
logger.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
Handler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
clients = new Vector<>();
//authService = new SimpleAuthService();
authService = BDAuthService.getInstance();
ExecutorService clientsExecutor = Executors.newCachedThreadPool();
try (ServerSocket serverSocket = new ServerSocket(8189)) {
logger.info("Сервер запущен на порту 8189");
while (true) {
Socket socket = serverSocket.accept();
clientsExecutor.submit(new ClientHandler(this, socket));
logger.fine("Подключился новый клиент");
}
} catch (IOException e) {
logger.severe("Произошла ошибка при основного сокета сервера");
}
finally {
BDAuthService.close();
clientsExecutor.shutdown();
}
logger.info("Сервер завершил свою работу");
}
public void broadcastMsg(String msg) {
for (ClientHandler o : clients) {
o.sendMsg(msg);
}
}
public void privateMsg(ClientHandler sender, String receiverNick, String msg) {
if (sender.getNickname().equals(receiverNick)) {
sender.sendMsg("заметка для себя: " + msg);
return;
}
for (ClientHandler o : clients) {
if (o.getNickname().equals(receiverNick)) {
o.sendMsg("от " + sender.getNickname() + ": " + msg);
sender.sendMsg("для " + receiverNick + ": " + msg);
return;
}
}
sender.sendMsg("Клиент " + receiverNick + " не найден");
}
public void subscribe(ClientHandler clientHandler) {
clients.add(clientHandler);
broadcastClientsList();
}
public void unsubscribe(ClientHandler clientHandler) {
clients.remove(clientHandler);
broadcastClientsList();
}
public boolean isNickBusy(String nickname) {
for (ClientHandler o : clients) {
if (o.getNickname().equals(nickname)) {
return true;
}
}
return false;
}
public void broadcastClientsList() {
StringBuilder sb = new StringBuilder(15 * clients.size());
sb.append("/clients ");
// '/clients '
for (ClientHandler o : clients) {
sb.append(o.getNickname()).append(" ");
}
// '/clients nick1 nick2 nick3 '
sb.setLength(sb.length() - 1);
// '/clients nick1 nick2 nick3'
String out = sb.toString();
for (ClientHandler o : clients) {
o.sendMsg(out);
}
}
}