请做一个功能俱全的使用Java的swing的聊天室服务端和客户端代码
以下是一个使用Java的Swing编写的简单聊天室的服务端和客户端代码示例:
服务端代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
private static final int PORT = 12345;
private static Set<PrintWriter> clients = new HashSet<>();
public static void main(String[] args) throws Exception {
System.out.println("服务器运行中...");
ServerSocket serverSocket = new ServerSocket(PORT);
try {
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接: " + clientSocket);
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clients.add(writer);
new ClientHandler(clientSocket, writer).start();
}
} finally {
serverSocket.close();
}
}
private static class ClientHandler extends Thread {
private Socket clientSocket;
private PrintWriter writer;
public ClientHandler(Socket socket, PrintWriter writer) {
this.clientSocket = socket;
this.writer = writer;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message;
while ((message = reader.readLine()) != null) {
System.out.println("接收到消息: " + message);
broadcast(message);
}
} catch (IOException e) {
System.out.println("客户端断开连接: " + clientSocket);
} finally {
if (writer != null) {
clients.remove(writer);
}
try {
clientSocket.close();
} catch (IOException e) {
}
}
}
}
private static void broadcast(String message) {
for (PrintWriter client : clients) {
client.println(message);
client.flush();
}
}
}
客户端代码:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client {
private static final String SERVER_HOST = "localhost";
private static final int SERVER_PORT = 12345;
private static final String USERNAME = "Guest";
private JFrame frame;
private JTextField messageField;
private JTextArea chatArea;
private PrintWriter writer;
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
try {
Client client = new Client();
client.frame.setVisible(true);
client.connectToServer();
} catch (Exception e) {
e.printStackTrace();
}
});
}
public Client() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setTitle("聊天室");
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
chatArea = new JTextArea();
chatArea.setEditable(false);
scrollPane.setViewportView(chatArea);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.SOUTH);
panel.setLayout(new BorderLayout());
messageField = new JTextField();
panel.add(messageField, BorderLayout.CENTER);
messageField.setColumns(10);
messageField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
JButton sendButton = new JButton("发送");
panel.add(sendButton, BorderLayout.EAST);
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
}
private void connectToServer() throws IOException {
Socket socket = new Socket(SERVER_HOST, SERVER_PORT);
writer = new PrintWriter(socket.getOutputStream());
new Thread(new ServerListener(socket)).start();
}
private void sendMessage() {
String message = messageField.getText();
writer.println(USERNAME + ": " + message);
writer.flush();
messageField.setText("");
}
private class ServerListener implements Runnable {
private Socket socket;
public ServerListener(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while ((message = reader.readLine()) != null) {
chatArea.append(message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这个简单的聊天室使用Swing界面库来创建客户端界面,并通过Socket进行客户端和服务端之间的通信。客户端可以通过输入框发送消息,服务端会将接收到的消息广播给所有连接的客户端
原文地址: https://www.cveoy.top/t/topic/iyE9 著作权归作者所有。请勿转载和采集!