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