图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行多次对话

1. 项目结构

 1.1 基本架构

本项目采用基于Java的`Swing`库进行图形界面开发,并使用`ServerSocket`和`Socket`进行网络通信。项目包名为`org.example.tcp`。

 1.2 模块划分

项目主要分为以下几个模块:

图形用户界面(GUI)模块

网络通信模块

线程处理模块

 2. GUI设计

 2.1 主窗口设计

 2.1.1 创建主窗口

主窗口使用`JFrame`进行创建。需要设置窗口的标题、大小以及关闭操作。为了实现更灵活的布局管理,采用`BorderLayout`布局管理器。

frame = new JFrame("Socket Chat Server");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(400, 300);

frame.setLayout(new BorderLayout();

 2.2 聊天记录显示区域

 2.2.1 创建并设置`JTextArea`

聊天记录显示区域使用`JTextArea`进行实现,并设置为不可编辑以确保聊天记录的完整性。

 2.2.2 添加滚动功能

为了支持滚动功能,将`JTextArea`放置在`JScrollPane`中,这样可以在聊天记录超出显示区域时进行滚动查看。

chatArea = new JTextArea();

chatArea.setEditable(false);

JScrollPane scrollPane = new JScrollPane(chatArea);

frame.add(scrollPane, BorderLayout.CENTER);

 2.3 输入区域和发送按钮

 2.3.1 创建输入框和按钮

使用`JTextField`创建消息输入框,使用`JButton`创建发送按钮。将这两个组件放置在一个`JPanel`中,并使用`BorderLayout`布局管理器进行布局。

inputField = new JTextField();

sendButton = new JButton("Send");

 2.3.2 添加按钮点击事件

为发送按钮添加点击事件监听器,当用户点击按钮时,触发发送消息的操作。

sendButton.addActionListener(new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent e) {

        sendMessage();

    }

});

 2.3.3 布局输入区域

将输入框和按钮放置在`JPanel`中,并添加到主窗口的南部区域。

JPanel inputPanel = new JPanel();

inputPanel.setLayout(new BorderLayout());

inputPanel.add(inputField, BorderLayout.CENTER);

inputPanel.add(sendButton, BorderLayout.EAST);

frame.add(inputPanel, BorderLayout.SOUTH);

frame.setVisible(true);

 3. 网络通信

 3.1 启动服务器

 3.1.1 创建`ServerSocket`

在指定端口启动`ServerSocket`,并显示服务器启动信息到聊天区域。

serverSocket = new ServerSocket(port);

chatArea.append("Server started on port " + port + "\n");

 3.2 等待客户端连接

 3.2.1 接受客户端连接

调用`accept`方法阻塞等待客户端连接,接受连接后显示客户端连接信息到聊天区域。

clientSocket = serverSocket.accept();

chatArea.append("Client connected: " + clientSocket.getInetAddress().getHostAddress() + "\n");

 3.3 处理客户端消息

 3.3.1 获取输入输出流

从客户端的`Socket`中获取输入流`BufferedReader`和输出流`PrintWriter`,以进行消息传递。

out = new PrintWriter(clientSocket.getOutputStream(), true);

in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

 3.3.2 创建并启动消息接收线程

为了不阻塞主线程,需要创建并启动一个新的线程来处理接收客户端消息的任务。在该线程中,循环读取客户端发送的消息,并将其显示在聊天区域。

Thread receiveThread = new Thread(new Runnable() {

    @Override

    public void run() {

        String inputLine;

        try {

            while ((inputLine = in.readLine()) != null) {

                chatArea.append("Client: " + inputLine + "\n");

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

});

receiveThread.start();

 3.4 发送消息

 3.4.1 实现消息发送功能

在发送按钮的事件监听器中,获取输入框中的消息,使用输出流将消息发送到客户端,并在聊天区域显示发送的消息。

private void sendMessage() {

    String message = inputField.getText();

    out.println(message);

    chatArea.append("服务端: " + message + "\n");

    inputField.setText("");

}

 3.4.2 清空输入框

在发送消息后,清空输入框以便用户输入下一条消息。

inputField.setText("");

这样,整个服务器端程序的设计和实现就介绍完毕了。通过以上步骤,我们创建了一个简单的Socket聊天服务器,具备图形用户界面,能够处理多次对话,并且可以发送和接收消息。客户端程序的设计和实现与服务器端类似,可以参照服务器端的思路进行开发。

4.运行截图

关于客户端在下一个帖子继续发,需要源码的可以私我哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值