启动SocketServer作为消息中心,SocketClient作为聊天客户端,由SocketClient发出的消息都会在SocketServer上打印输出,启动多个SocketClient即可实现简易的群聊
SocketServer
package com.dg.net;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
/**
* Socket 服务端
*
* @author Ding Guang
* @date 2020/1/9 19:21
*/
public class SocketServer {
// 记录已经建立连接的socket客户端
private static volatile List<Socket> socketList = new ArrayList<>();
private static volatile Map<String, Thread> threadMap = new HashMap<>();
private static volatile ThreadGroup threadGroup = new ThreadGroup("group");
public static void main(String[] args) {
threadMap.put("main", Thread.currentThread());
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(9999);
Thread daemonThread = new Thread(threadGroup, () -> {
// 控制台输入bye关闭socketServer
printBye4CloseServer(serverSocket);
});
daemonThread.setDaemon(true);
daemonThread.start();
while (true) {
// 循环接收客户端消息
acceptSocketClient(serverSocket);
}
} catch (IOException e) {
System.out.println("create serverSocket error ...");
}
}
/**
* socket 客户端连接服务端
*
* @param serverSocket
*/
private static void acceptSocketClient(ServerSocket serverSocket) {
if (!SocketHelper.checkServerSocket(serverSocket)) {
return;
}
try {
Socket socket = serverSocket.accept();
if (socket.isConnected()) {
// 记录连接的socket客户端
socketList.add(socket);
System.out.println("client-" + socket.getInetAddress() + " connected success");
}
InputStream inputStream = socket.getInputStream();
/*OutputStream outputStream = socket.getOutputStream();*/
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
/*BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));*/
new Thread(threadGroup, () -> {