仿QQ聊天软件(登录界面、好友界面、聊天界面)-Java(Swing、Socket)

文章目录一、项目结构二、项目功能三、制作界面(一)、登录界面的制作(二)、好友列表界面(三)、聊天界面四、制

文章目录

  • 一、项目结构
  • 二、项目功能
  • 三、制作界面
    • (一)、登录界面的制作
    • (二)、好友列表界面
    • (三)、聊天界面
  • 四、制作服务器
  • 五、设计通信协议
  • 六、项目缺点

学习了socket通信后,就想来制作一个类似QQ的聊天小程序,所以制作了这个仿QQ聊天软件,使用了Swing和Socket通信来实现的,由于没有使用数据库技术,所以并没有实现消息缓存等功能,只能实现在线聊天。还有几个功能还未完善,有时间会继续完善这个项目。下面先上效果图

登录界面:

各项服务:

好友列表

聊天界面

一、项目结构

这个项目总的来说就是三大块内容,分别是GUI设计与制作,通信协议,服务端设计。项目各项功能都是基于这几项来完成的。下面我们先看一个结构模式图。

客户端结构:

服务器结构:

项目工作模式图

二、项目功能

  • 登录功能
  • 修改密码
  • 注册账号
  • 好友列表
  • 发起聊天
  • 加好友
  • 在线通知
  • 群聊功能(还未完成)后续有时间完善
  • 视频聊天(还未完成)后续有时间完善

三、制作界面

(一)、登录界面的制作

在写界面的时候遇到一个问题,我们平常用JFrame写出来的窗体,会出现其自带的标题栏和图标,但是我们观察QQ的登录界面的标题栏好像并不长这样,于是,我们就想把标题栏去掉。但是去掉之后,我们怎么拖动窗体呢?又怎么关闭和缩小窗体呢?
一步一步来看:
首先去除窗体标题栏的操作:调用setUndecorated()方法,就可以去除标题栏。

this.setUndecorated(true);//去除标题栏

下一步:制作缩小和关闭的按钮
这个其实就是常规的按钮JButton就好。
这里需要调用两个方法,是使窗体缩小和关闭的两个方法。

ui.setExtendedState(JFrame.ICONIFIED);//缩小
ui.dispose();//关闭

解决了窗体标题栏的问题,那么接下来就是制作窗体了,你可以把这个没有标题栏的窗体当做你的画布,尽情设计一个窗体出来,对于使用的密码输入框和选择框,按钮如何设置透明和边框,可以参考swing的帮助文档自己进行修改。

(二)、好友列表界面

同样的,我们参考之前制作登录界面的方式去制作这一个好友列表的界面,使用方法和登录界面是一致的。

(三)、聊天界面

这里我们需要介绍一个容器,我们如何制作出类似上面那个效果呢?其实很简单,我们可以使用container来进行存储组件。我们知道,我们每一条消息都有三个组件:昵称,头像,消息,我们可以用三个标签来存放这三个东西,然后将他们放在container容器中,再将这个container容器放在JPanel上,这样我们就实现了每一条消息的封装。

				Container container=new Container();
                container.setSize(870,80);
                container.setLayout(null);

                JLabel jLabel=new JLabel();
                jLabel.setSize(80,80);
                icon.setImage(icon.getImage().getScaledInstance(80,80,0));
                jLabel.setIcon(icon);
                jLabel.setLocation(0,0);
                container.add(jLabel);

                JLabel jLabel1=new JLabel(other,SwingConstants.LEFT);
                jLabel1.setSize(messages.get(i).getWho().getBytes().length*20,30);
                jLabel1.setFont(new Font("楷体",Font.BOLD,30));
                jLabel1.setLocation(80,0);
                container.add(jLabel1);

                JLabel jLabel2=new JLabel(messages.get(i).getMessage(),SwingConstants.LEFT);
                jLabel2.setSize(messages.get(i).getMessage().getBytes().length*30,50);
                jLabel2.setFont(new Font("楷体",Font.BOLD,40));
                jLabel2.setLocation(80,30);
                container.add(jLabel2);

                container.setVisible(true);
                container.setLocation(0,i*80);
                this.add(container);

四、制作服务器

服务器主要负责解析来自客户端的各项消息,这里我设计的服务端,在接收到连接后,会对连接进行分类,一类是负责处理各项请求和功能实现的Socket,一类是只进行聊天的socket,这样设计的好处是,在设计通信协议的时候没有那么复杂,可以将聊天消息与服务请求分开。

public class MainServer implements Runnable{
    private ServerSocket serverSocket;
    private List<Socket> socketList=new Vector<Socket>();//业务办理socket
    private List<SocketType> chatsocketList=new Vector<SocketType>();//双方加好友通信socket
    private List<UserType> userTypes=new Vector<>();//保存当前共申请了多少用户
    private List<UserType> nowuser=new Vector<>();//保存当前在线的人员
    public static void main(String[] args) {
        MainServer server=new MainServer();
    }
    public MainServer()
    {
        try {
            serverSocket=new ServerSocket(9998);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("开始监听");
        new Thread(this).start();
    }

    @Override
    public void run() {
        while (true)
        {
            int n=0;
            try {
                Socket sockets= serverSocket.accept();
                InputStream is=sockets.getInputStream();
                n=is.read();//读socket类型
                //分类保存socket类型
                if(n==1)
                {
                    socketList.add(sockets);
                    ServerThread serverThread=new ServerThread(sockets,userTypes,nowuser);
                    serverThread.start();
                }
                else if(n==2)
                {
                    //读取请求方qq号
                    int length1=is.read();
                    byte[] number=new byte[length1];
                    is.read(number);
                    String num=new String(number);

                    //读取被请求方qq号
                    int length2=is.read();
                    byte[] number2=new byte[length2];
                    is.read(number2);
                    String num2=new String(number2);
                    SocketType socketType=new SocketType(n,num,num2,sockets);
                    chatsocketList.add(socketType);
                    ChatThread chatThread=new ChatThread(chatsocketList,sockets);
                    chatThread.start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

五、设计通信协议

这里我们需要设计一个通信协议,然后服务器通过这个协议来解析来自客户端的各项消息,客户端在给服务器发消息的时候,也需要遵守这个协议,这样在读数据的时候才不会混乱。

这是我使用的协议
服务协议:【消息类型】-【读取的内容】-进行的操作

  • 1-【密码】【昵称】-返回QQ号(申请QQ号)
  • 2-【QQ号】【新密码】-返回结果(修改密码)
  • 3-【QQ号】【密码】-返回结果和好友列表(登录)
  • 4-【请求方QQ】【被请求方QQ】-将请求发送给被请求方(加好友)
  • 5-【应答方QQ】【请求方QQ】【结果】-将结果发送至请求方(加好友的应答)
  • 6-【读取下线QQ】-删除在线用户中的该用户(下线通知)
  • 7-【请求方QQ】【被请求方QQ】-发送聊天请求给被请求方(聊天请求)
  • 8-【应答方QQ】【请求方QQ】【应答结果】-将结果发送给请求方(聊天应答)

客户端发消息协议:【消息类型】【消息内容】
对于客户端发送的消息,是与上方的服务器接收协议一致,发的时候照着上面的通信协议发消息就可以了。

客户端接收消息协议:【消息类型】【消息内容】-执行的操作

  • 1-【注册结果】-弹窗
  • 2-【修改密码结果】-弹窗
  • 3-【登录结果】-创建好友列表-【接收好友列表】
  • 4-【加好友请求结果】-弹窗
  • 5-【请求方QQ】【请求方昵称】-弹出加好友请求窗体
  • 6-【加好友结果】【被请求方号码】【昵称】-加入好友列表
  • 7-【上线号码】-加入在线列表
  • 8-【下线号码】-从在线列表中删除
  • 9-【请求结果】-弹窗
  • 10-【请求方号码】【请求方昵称】-结果
  • 11-【读取结果】【读取号码】-弹出聊天界面

聊天协议:
【发出方QQ】【接收方QQ】【消息内容】

上面的协议写起来是我认为最困难的一步,因为消息很多,需要解析很多消息,当然,可以设计一个万用的消息协议,每次解析的流程都是一样的,那么会减少很多代码。但是我暂时没想出来。

六、项目缺点

  • 没有使用数据库,数据存储与应用没有分开
  • 消息协议比较复杂,代码长度很长
  • 不能进行缓存,聊天只能实时通信

结尾附上代码,欢迎大家下载交流,提出修改意见~
源码地址

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754690093a5191493.html

相关推荐

  • 如何在电脑端写qq看点文章?如何在电脑端找QQ看点

    一般来说&#xff0c;电脑端只能接受到腾讯新闻消息&#xff0c;但是 QQ看点的具体位置没有。要想写QQ看点的文章&#xff0c;要注册企鹅号。一、百度搜索企鹅号&#xff0c;如下如&#xff1

    1月前
    180
  • QQ登录, 腾讯开放平台和QQ互联的坑

    最近&#xff0c;项目中&#xff0c;QQ登录的APPid 和key 是 腾讯开放平台的&#xff0c;如果要转换成QQ互联&#xff0c;必须QQ互联关联腾讯开放平台&#xff0c;并审核通过&

    1月前
    180
  • 手机QQ邮箱登录不上的解决办法

    手机登录QQ邮箱登录不上报&#xff0c;IMAP服务关闭或用户名密码错误。首先检查自己用户名和密码有没有输入错误&#xff0c;若没有请接着往下看。 这是QQ邮箱有的一种服务没开&#xff0c;这个需要用网页登录Q

    1月前
    230
  • QQ在线小工具箱网页源码+支持强制对话等

    正文:功能列表:1、强制对话聊天2、强制查看名片3、获取空间说说4、获取王者语音程序:wwbwd.lanzouiidd7Y0ag1c9e图片:

    1月前
    180
  • CAD2020-绘图之认识界面

    绘图直线-L普通直线无需多言有角度的直线&#xff1a;选择直线后&#xff0c;点击鼠标选择起点输入<30即可画出与水平面成30度的斜线&#xff0c;再输入长度&#xff0c;则可完成绘画。多段线-

    1月前
    160
  • studio界面、快捷键

    按键 说明F1帮助Alt(Option)F1查找文件所在目录位置Alt(Option)1快速打开或隐藏工程面板Ctrl(Command)Alt(Option)打开设置对话框Alt(Option)Home跳转到导航栏Esc光标返回编辑框Shi

    1月前
    150
  • QT界面无响应解决办法汇总

    QT界面无响应解决办法汇总 无响应情况示例 解决方案 显卡问题 方法1(笔记本适用,台式PC可能不行) 方法2(适用不存在上述方法的首选图形处理器选项的台式PC) 显卡驱动原因 其他软件进程的干涉(如HOOK) 其他可能的解决办法 无响应情

    1月前
    220
  • 登录器界面颜色提取与应用

    本文还有配套的精品资源&#xff0c;点击获取简介&#xff1a;本文介绍了一个名为ColorTools.exe的工具&#xff0c;用于在软件登录界面或管理系统中提取和分析颜色信息。颜色设计对于提升视觉效果

    1月前
    230
  • 小鹿播放器 - 一款新的VOD播放器,界面和阿七播放器 毫米级相似 附播放器源

    小鹿播放器 - 一款新的VOD播放器&#xff0c;界面和阿七播放器 毫米级相似 目前仅支持IOS和MAC&#xff0c;免费下载 &#x1f447;&#x1f447;&#x1f447; https

    1月前
    200
  • QQ登录页面制作

    效果图&#xff1a;<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8">&l

    1月前
    170
  • 通过C# Winform实现与QQ的交互及消息发送

    本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文将探讨如何使用C# Winform应用程序与本地已登录QQ程序交互&#xff0c;发送消息给指定好友。首先&#xff0c;介绍Win

    1月前
    180
  • 2023 QQ云端机器人登录系统php源码 开心版

    本源码已全解密&#xff0c;去授权版&#xff0c;可能很多人不知道这源码有什么用&#xff0c;这款源码主要是针对群机器人爱好者的&#xff0c;这是一个通过对接挂机宝里面机器人框架的一个网页站点&

    1月前
    240
  • 微信小程序登录注册界面(示例二)

    微信小程序登录注册功能&#xff1a;基本的界面设计先看示例图片效果&#xff1a;一、项目背景与功能概述在微信小程序开发中&#xff0c;登录注册模块是几乎所有应用的基础功能。本文将分享一个完整的微信小程序登录

    1月前
    240
  • 腾讯开放平台实现QQ登录

    现在的第三方登录很普遍如QQ,微博,微信,今天我们就来实现如何接入QQ登录到我们的项目中要想使用QQ登录我们需要到腾讯开放平台注册账号获取开发者资格地址:http:open.qq 注册完成后点击我们右上角的管理中心 进入管理中心后

    1月前
    210
  • QQ登录测试用例

    今日总结&#xff1a;1&#xff09;loadrunner的使用流程&#xff1a;①指定测试计划  ②创建测试脚本  ③创建场景  ④运行场景  ⑤  监控测试场景  ⑥分析测试结果  2&#xff09

    1月前
    180
  • 还在用QQ拼音输入法吗?赶快卸载吧~!

    最近总觉得我的C盘在莫名其妙的减少。之前的电脑C盘只有240G&#xff0c;所以我很在意C盘空间。但是&#xff0c;我发现买了新电脑&#xff0c;C盘空间也在莫名其妙减少。随挨个文件夹检查。最后发现&#

    1月前
    180
  • 网站QQ客服直接临时会话

    qq临时会话如果不开启的话&#xff0c;对方必须加你为好友才能跟你对话&#xff0c;这种体验度不是很好&#xff0c;尤其是对于网站客服而言。进入腾讯“QQ推广”主页&#xff0c;登陆你需要设置的QQ访

    1月前
    200
  • QQ的信息泄露伦理问题

    网上对qq信息泄露的伦理问题众说纷纭&#xff0c;以下为一些网站内容借鉴。 前两天就听说腾讯隐私泄露的新闻。说网络时代什么都安全不了&#xff0c;作为中国社交工具鼻祖的腾讯QQ也被爆出大量用户隐私遭泄。接着乌云平台有爆

    1月前
    220
  • odoo 配置qq邮箱详解

    序言:时间是我们最宝贵的财富,珍惜手上的每个时分 邮件作为一个主流的营销渠道,一直是无可替代的,在odoo中也无可替代。此处记录一下免费的个人qq邮箱如何进行odoo邮件代发 目录 一:账号准备 二:odoo中邮件服务器设置 三:错

    1月前
    160
  • 【行业秘密公开】所谓的QQ刷钻业务

    这些人 通常打着&#xff0c;给人刷钻、以及教人刷钻、优惠的价格作为诱饵。当你信以为真的时候 就上当了。这些人 通常打着&#xff0c;给人刷钻、以及教人刷钻、优惠的价格作为诱饵。当你信以为真的时候 就上当了。这篇文章也教

    1月前
    240

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信