Server群聊服务器
public class ChatRoomServer {
static List<Socket> socketList = new ArrayList<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
new Thread(new CSThread.ServerMsgAllSend(socketList)).start();
while (true) {
Socket socket = serverSocket.accept();
socketList.add(socket);
new Thread(new CSThread.ServerReadMsgThread(socket)).start();
}
}
}
客户端
public class ChatClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 9999);
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的用户名");
String nickName = sc.next();
new Thread(new CSThread.ClientReadServerMsg(socket)).start();
while (true){
ServerTool.send(nickName,socket);
}
}
}
ServerTool 工具类[判断客户端退出,删除客户端,Server群发消息,Send]
public class ServerTool {
static List<Socket> socketList = new ArrayList<>();
public static boolean clientIsClose(Socket socket){
try {
socket.sendUrgentData(0);
return false;
}catch (Exception e){
deleteSocket(socket);
return true;
}
}
public static void deleteSocket(Socket socket){
socketList.remove(socket);
}
public static void sendAll(List<Socket> socketList,String msg){
for(Socket socket:socketList){
if (clientIsClose(socket))
continue;
try {
OutputStream ops = socket.getOutputStream();
ops.write((msg).getBytes());
ops.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void send(String nickName ,Socket socket) throws Exception {
OutputStream out = socket.getOutputStream();
Scanner s = new Scanner(System.in);
System.out.println("请输入您要发送的内容:");
String content = s.next();
String msg = nickName +"&"+ content;
out.write(msg.getBytes());
}
}
Server&Client线程类[Server获取信息,Server群发消息,Client]
public class CSThread {
static class ServerReadMsgThread implements Runnable {
private Socket socket;
public ServerReadMsgThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
boolean flag = true;
String clientName = "";
String clientmsg = "";
try {
while (true) {
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = in.read(bytes);
String msg = new String(bytes, 0, read);
String[] split = msg.split("&");
clientName = split[0];
clientmsg = split[1];
if (flag) {
System.out.println(clientName + "上线了...");
flag = false;
}
System.out.println(clientName
+ "说:" + clientmsg);
}
} catch (Exception e) {
if (ServerTool.clientIsClose(socket) && clientName != "") {
System.out.println(clientName + "下线了...");
}
}
}
}
static class ServerMsgAllSend implements Runnable {
private List<Socket> socketList;
public ServerMsgAllSend(List<Socket> socketList) {
this.socketList = socketList;
}
@Override
public void run() {
try {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入群发的消息:");
String msg = sc.nextLine();
ServerTool.sendAll(socketList, msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class ClientReadServerMsg implements Runnable {
private Socket socket;
public ClientReadServerMsg(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while (true) {
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = in.read(bytes);
String serverMsg = new String(bytes, 0, read);
System.out.println("server:" + serverMsg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}