-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSocketServer2.java
More file actions
119 lines (101 loc) · 2.78 KB
/
Copy pathSocketServer2.java
File metadata and controls
119 lines (101 loc) · 2.78 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SocketServer2 {
private ServerSocket serverSocket;
private ExecutorService executorService;
private List<Socket> socketList;
public static void main(String[] args) {
new SocketServer2();
}
public SocketServer2() {
try {
// 创建ServerSocket实例并绑定端口号:12345
serverSocket = new ServerSocket(12345);
// 创建线程池
executorService = Executors.newCachedThreadPool();
System.out.println("服务端运行中...\n");
Socket socket = null;
socketList = new ArrayList<Socket>();
while (true) {
socket = serverSocket.accept();
socketList.add(socket);
executorService.execute(new Service(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
class Service implements Runnable {
private Socket socket;
private BufferedReader reader = null;
private String message = "";
public Service(Socket socket) {
this.socket = socket;
try {
reader = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
message = "用户:" + this.socket.getInetAddress() + "加入了聊天室\n"
+ "当前在线人数:" + socketList.size();
this.sendMessage();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
if ((message = reader.readLine()) != null) {
if (message.equals("bye")) {
System.out.println("--------------------");
socketList.remove(socket);
reader.close();
message = "用户:" + socket.getInetAddress() + "退出\n"
+ "当前在线人数:" + socketList.size();
socket.close();
this.sendMessage();
break;
} else {
message = socket.getInetAddress() + "说:" + message;
this.sendMessage();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 给连接上服务端的每个客户端发送信息
public void sendMessage() {
System.out.println(message);
int account = socketList.size();
for (int i = 0; i < account; i++) {
Socket socket = socketList.get(i);
try {
PrintWriter writer = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream(), "UTF-8")), true);
writer.println(message);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}