import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ChatServer {
private static final int PORT = 12345;
private static Set<ClientHandler> clientHandlers = new HashSet<>();
private static List<String> users = new ArrayList<>();
private static JTextArea textArea;
public static void main(String[] args) {
JFrame frame = new JFrame("大学牲-群聊");
textArea = new JTextArea(20, 40);
textArea.setEditable(false);
frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
System.out.println("Chat server started...");
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected: " + socket.getInetAddress());
ClientHandler clientHandler = new ClientHandler(socket);
clientHandlers.add(clientHandler);
new Thread(clientHandler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
static void broadcast(String message) {
SwingUtilities.invokeLater(() -> textArea.append(message + "\n"));
for (ClientHandler clientHandler : clientHandlers) {
clientHandler.sendMessage(message);
}
}
static void sendToServer(String message) {
SwingUtilities.invokeLater(() -> textArea.append("Message to server: " + message + "\n"));
}
static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
private String name;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
out.println("Enter your name:");
name = in.readLine();
synchronized (users) {
users.add(name);
}
System.out.println("User joined: " + name);
String message;
while ((message = in.readLine()) != null) {
System.out.println("Received from " + name + ": " + message);
if (message.startsWith("@") && message.contains("=")) {
// Private message
String[] parts = message.split("=", 2);
if (parts.length == 2) {
String targetName = parts[0].substring(1);
String privateMessage = parts[1];
sendPrivateMessage(targetName, privateMessage);
}
} else {
// Message to server
sendToServer(name + ": " + message);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeConnection();
}
}
private void sendPrivateMessage(String targetName, String message) {
for (ClientHandler clientHandler : clientHandlers) {
if (clientHandler.name.equals(targetName)) {
clientHandler.sendMessage("Private from " + name + ": " + message);
break;
}
}
}
void sendMessage(String message) {
out.println(message);
}
private void closeConnection() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
clientHandlers.remove(this);
synchronized (users) {
users.remove(name);
}
System.out.println("User left: " + name);
}
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ChatClient {
private String hostname;
private int port;
private String userName;
private Socket socket;
private PrintWriter out;
private JFrame frame = new JFrame("Chat Client");
private JTextArea textArea = new JTextArea(20, 40);
private JTextField textField = new JTextField(40);
private JButton sendButton = new JButton("Send");
public ChatClient(String hostname, int port) {
this.hostname = hostname;
this.port = port;
}
public void execute() {
try {
socket = new Socket(hostname, port);
System.out.println("Connected to the server");
new ReadThread(socket).start();
out = new PrintWriter(socket.getOutputStream(), true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
textArea.setEditable(false);
frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(textField, BorderLayout.CENTER);
panel.add(sendButton, BorderLayout.EAST);
frame.add(panel, BorderLayout.SOUTH);
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
frame.pack();
enterUserName();
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void enterUserName() {
userName = JOptionPane.showInputDialog(frame, "Enter your name:");
if (userName != null && !userName.isEmpty()) {
out.println(userName);
frame.setTitle(userName); // 设置窗体标题为用户名
}
}
private void sendMessage() {
String message = textField.getText();
if (message != null && !message.isEmpty()) {
out.println(message);
System.out.println("Sent: " + message);
textField.setText("");
}
}
private class ReadThread extends Thread {
private BufferedReader in;
public ReadThread(Socket socket) {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String response;
while ((response = in.readLine()) != null) {
textArea.append(response + "\n");
System.out.println("Received: " + response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ChatClient client = new ChatClient("localhost", 12345);
client.execute();
}
}