Title image
Venusの自留地

基于 TCP/IP 的群聊系统


1.简介

课程设计项目,Java实现一个基于TCP/IP的群聊系统,要求支持消息以及文件传输,同时需要在GUI界面看到在线列表。
项目本身很简单,写写服务端客户端再加上Message这个类,用上多线程就完了。GUI的话用Swing包里的组件来写就完成了。
后续我对项目额外做了点美化,导入flatlaf这个包,仿Telegram风格,同时实现使用内网穿透工具进行不同局域网的互联等功能。

2. 代码部分

这里放一下仿Telegram风格的代码,项目的完整代码请在这里查看:

package com.chat.client;

import javax.swing.*;
import java.awt.*;

public class BubblePanel extends JPanel {
    private boolean isSelf;
    private Color bgColor;

    public BubblePanel(String sender, String text, String time, boolean isSelf) {
        this.isSelf = isSelf;
        this.bgColor = isSelf ? new Color(238, 255, 222) : Color.WHITE;
        setOpaque(false);
        setLayout(new BorderLayout(8, 2));
        JPanel contentPanel = new JPanel();
        contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
        contentPanel.setOpaque(false);
        if (!isSelf && sender != null) {
            JLabel lblSender = new JLabel(sender);
            lblSender.setFont(new Font("Microsoft YaHei UI", Font.BOLD, 12));
            lblSender.setForeground(new Color(43, 130, 202));
            contentPanel.add(lblSender);
            contentPanel.add(Box.createVerticalStrut(2));
        }
        JLabel lblText = new JLabel(text);
        lblText.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));
        lblText.setForeground(new Color(34, 34, 34));
        contentPanel.add(lblText);
        JLabel lblTime = new JLabel(time);
        lblTime.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 10));
        lblTime.setForeground(new Color(150, 160, 170));
        lblTime.setHorizontalAlignment(SwingConstants.RIGHT);
        setBorder(BorderFactory.createEmptyBorder(6, 10, 5, 10));
        add(contentPanel, BorderLayout.CENTER);
        add(lblTime, BorderLayout.SOUTH);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(bgColor);
        g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
        if (!isSelf) {
            g2.setColor(new Color(225, 230, 235));
            g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
        }
        g2.dispose();
        super.paintComponent(g2);
    }
}

3. 程序构建

跨局域网互联看着唬人,实际上就是让用户自己输内网穿透工具映射的端口和IP。而为了让我和朋友能直接打开程序使用而不是每次从IDEA启动,我先把项目服务端和客户端的main方法全部构建成jar,再用launch4j把jar打包成.exe文件。

4. 效果展示



本文总阅读量:




:D 获取中...


© - Venus - 2023 - 2026 - Powered by Hexo Theme Quark


加载中... 我正在使用
电量: --%
设备: Redmi Note9P