-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChatServer.java
More file actions
99 lines (95 loc) · 4.23 KB
/
ChatServer.java
File metadata and controls
99 lines (95 loc) · 4.23 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
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.TreeSet;
public class ChatServer implements Runnable{ //распределяет сообщения между участниками чата
ServerSocket server;
private final int port;
TreeSet<ChatMember> chatMembers = new TreeSet<ChatMember>();
ArrayDeque<String> history = new ArrayDeque<String>();
public ChatServer(int port) {
this.port = port;
}
protected boolean registerMember(ChatMember member) {
if (!chatMembers.contains(member)) { //Если такого пользователя нет
member.send("================================================");
for (String s : history) { //рассказываем новичку, что было в чате
member.send(s);
}
spreadMessage(null, new StringBuilder(member.getName()).append(" заходит в чат.").toString()); //оповещаем участников о новичке
chatMembers.add(member); //и, наконец, добавляем новичка в чат
new Thread(member).start(); //дальше он будет сам управлять соединением
return true;
} else {
return false;
}
}
public void removeMember(ChatMember member) { //выкидываем пользователя из чата
try {
member.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
try {
chatMembers.remove(member);
spreadMessage(null, new StringBuilder(member.getName()).append(" покинул чат.").toString());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Connection closed");
}
protected void processMessage(ChatMember member, String message) { //обрабатываем сообщение участника чата
if (message != null) {
if (message.equals(":leave")) {
removeMember(member);
} else {
spreadMessage(member, message); //в стандартном случае рассылаем сообщение участникам
}
} else {
removeMember(member);
}
}
protected void spreadMessage(ChatMember member, String message) {
StringBuilder buff = new StringBuilder(member==null?"Server":member.getName()).append(": ").append(message); //готовим строку
if(history.size()>14) {
history.pop();
}
history.add(buff.toString()); //добавляем в историю (для новичков)
for(Iterator<ChatMember> i = chatMembers.iterator(); i.hasNext();) { //рассылаем сообщение участникам чата
ChatMember item = i.next();
if (item!=member) { //разумеется отправителю не присылаем
item.send(buff.toString());
}
}
}
public static void main(String[] args) {
ChatServer srv = new ChatServer(1234);
Thread thread = new Thread(srv);
thread.start(); //Создаём экземпляр сервера в отдельном потоке
/*while(true) {
break; //Здесь потом возможно добавлю меню сервера
}*/
}
@Override
public void run() {
try {
server = new ServerSocket(port);
} catch (IOException e) {
throw new RuntimeException(e);
}
while (true) {
System.out.println("Waiting...");
try {
Socket socket = server.accept();
System.out.println("New connection");
Connection connection = new Connection(this, socket); //Новое клиентское соединение
Thread thread = new Thread(connection);
thread.start(); //будем знакомиться
} catch (IOException e) {
e.printStackTrace();
}
}
}
}