以下是一个简单的 Java Swing 实现的图形界面聊天程序,包含客户端和服务器两个部分,用户可以在客户端窗口输入信息并发送到服务器,服务器窗口则显示来自客户端的信息,并可进行交互。

客户端程序窗口

import java.awt.BorderLayout;
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;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ClientWindow extends JFrame {
    private static final long serialVersionUID = 1L;
    private JTextField textField;
    private JTextArea textArea;
    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;
    private int clientNum;

    public ClientWindow(Socket socket, int clientNum) {
        super('Client ' + clientNum);
        this.socket = socket;
        this.clientNum = clientNum;

        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.NORTH);

        textField = new JTextField();
        panel.add(textField);
        textField.setColumns(20);

        JButton sendButton = new JButton('Send');
        panel.add(sendButton);

        textArea = new JTextArea(10, 30);
        getContentPane().add(textArea, BorderLayout.CENTER);

        pack();
        setVisible(true);

        try {
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            sendButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String message = textField.getText();
                    out.println('Client ' + clientNum + ': ' + message);
                    textField.setText('');
                }
            });

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String message;
                        while ((message = in.readLine()) != null) {
                            textArea.append(message + '\n');
                            if (message.equals('bye')) {
                                break;
                            }
                        }
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端程序窗口

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class ServerWindow extends JFrame {
    private static final long serialVersionUID = 1L;
    private JTextArea textArea;
    private List<ClientWindow> clients;

    public ServerWindow() {
        super('Server');

        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.NORTH);

        JButton closeButton = new JButton('Close');
        panel.add(closeButton);

        textArea = new JTextArea(10, 30);
        getContentPane().add(textArea, BorderLayout.CENTER);

        pack();
        setVisible(true);

        clients = new ArrayList<>();

        try {
            ServerSocket serverSocket = new ServerSocket(12345);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        while (true) {
                            Socket socket = serverSocket.accept();
                            ClientWindow clientWindow = new ClientWindow(socket, clients.size() + 1);
                            clients.add(clientWindow);
                            textArea.append('New client connected: ' + socket.getInetAddress().getHostAddress() + '\n');
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }

        closeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    for (ClientWindow clientWindow : clients) {
                        clientWindow.out.println('bye');
                        clientWindow.socket.close();
                    }
                    dispose();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
}

使用方法

  1. 运行 ServerWindow 类,启动服务器程序窗口。
  2. 运行 ClientWindow 类,启动客户端程序窗口。
  3. 在客户端程序窗口中输入信息,点击 Send 按钮发送到服务器。
  4. 在服务器程序窗口中可以看到客户端发送的信息,可以通过 TextArea 组件与客户端进行交互。
  5. 当客户端发送 'bye' 时,程序结束。
Java Swing 图形界面聊天程序:客户端与服务器交互

原文地址: https://www.cveoy.top/t/topic/nxSs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录