仿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>();//业务办理socketprivate List<SocketType> chatsocketList=new Vector<SocketType>();//双方加好友通信socketprivate 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();}@Overridepublic 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】【消息内容】

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

六、项目缺点

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53081.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android仿微信气泡聊天界面设计

微信的气泡聊天是仿iPhone自带短信而设计出来的&#xff0c;不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo&#xff0c;给大家分享一下&#xff01;效果图如下&#xff1a; 气泡聊天最终要的是素材&#xff0c;要用到9.png文件的素材&#xff0c;这样气泡会随着聊天…

计算机系统大作业

摘 要 尽管hello程序非常简单&#xff0c;但是为了让它实现运行&#xff0c;系统的每个主要组成部分都需要协调工作&#xff0c;本篇论文就是解释说明在系统上执行hello程序时&#xff0c;系统发生了什么以及为什么会这样。 我们通过跟踪hello程序的生命周期开始系统讲解——…

程序人生-Hello’s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 未来技术 学   号 2021112807 班 级 21WL021 学 生 马铭杨 指 导 教 师 史先俊 …

Google reCAPTCHA ----------验证码

现有验证码的产品形态调研范围如下&#xff0c;基本涵盖了比较主流的验证码平台&#xff1a; Google reCAPTCHA极验阿里云腾讯云点触网易易盾螺丝帽FunCaptcha 产品背景 ‍‍reCAPTCHA起初是由CMU&#xff08;卡耐基梅隆大学&#xff09;设计&#xff0c;将OCR&#xff08;光…

关于captcha验证码演示

转载&#xff1a;https://blog.csdn.net/dayonglove2018/article/details/106612549 import com.wf.captcha.SpecCaptcha; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springfr…

使用reCAPTCHA实现验证码

文章目录 HTML代码JS代码Java代码项目开源地址参考资料 HTML代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录</title><link rel"stylesheet" type"text/css" href"css/json-v…

手把手教你验证码检验的登录

在网站实际应用过程中&#xff0c;为了防止网站登录接口被机器人轻易地使用&#xff0c;产生一些没有意义的用户数据&#xff0c;所以&#xff0c;采用验证码进行一定程度上的拦截&#xff0c;当然&#xff0c;我们采用的还是一个数字与字母结合的图片验证码形式&#xff0c;后…

如何识别高级的验证码

http://sebug.net/paper/pst_WebZine/pst_WebZine_0x02/html/PSTZine_0x02_0x09.html Ph4nt0m Security TeamIssue 0x02, Phile #0x09 of 0x0A|---------------------------------------------------------------------------| |-----------------------[ 如何识别高级的验证码…

hcaptcha 我是人类验证码怎么跳过怎么验证自动识别

相信这个验证码很多人都见过&#xff0c;这个叫hcaptcha验证码 在网页上偶尔出现&#xff0c;提示需要你证明“我是人类” 这种验证码与谷歌的reCaptcha有异曲同工之处&#xff0c;但是其实hcaptcha与recaptcha是完全不同的产品&#xff0c;不是同一个公司出品的。 这种hcapt…

手把手教你识别FunCaptcha验证码

今天&#xff0c;我们将专注于FunCaptcha&#xff0c;这是一种独特而具有挑战性的CAPTCHA类型&#xff0c;在整个网络上越来越流行。我们将深入探讨FunCaptcha是什么&#xff0c;不同类型的FunCaptcha挑战&#xff0c;如何使用CapSolver解决它们等等。 什么是FunCaptcha&#…

基于openai chatgpt和embeddings制作私有知识库聊天机器人

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、原理、流程二、制作预料库三、制作问答功能总结 如果有问题可以联系我**&#xff1a;https://gitee.com/xiaoyuren/gpt3 前言 在当今信息爆炸的时代&#…

基于 Quivr 搭建个人知识库

目录 Quivr介绍 Quivr特性 Quivr演示 Demo with GPT3.5: Demo of the new version&#xff1a; Quivr实战 Quiv 使用的主要技术 Quiv 实践依赖 创建Supabase项目 部署Quiv项目 第一步&#xff1a;现在源码 第二步&#xff1a;设置环境变量 第三步&#xff1a;执行sql 第…

标书打印分册小技巧

标书打印出来后&#xff0c;一般都有很多本&#xff0c;去打印店胶装标书时&#xff0c;需要把每一本标书分出来&#xff0c;黑帽大师用便签纸就能方便的分出标书。 把便签纸贴在每本标书的最后一页上&#xff0c;这样就能方便的分出每一本了。

学校计算机维护投标书,信息化系统硬件及应用系统安全运维服务投标书范本

这是一份信息化系统硬件及应用系统安全运维服务投标书范本&#xff0c;含运维服务方案&#xff0c;word格式&#xff0c;可编辑&#xff0c;有需要的朋友可以参考学习。 信息化系统硬件及应用系统安全运维服务 本次服务范围为XX局信息化系统硬件及应用系统&#xff0c;各类软硬…

招投标小程序开发功能及源码

一般获取招投标信息的渠道主要有三种&#xff0c;一&#xff0c;来源于官方、正规的政府网站、公共资源交易中心等&#xff1b;二&#xff0c;能提供针对性的招投标信息平台&#xff1b;三是通过个人的人脉资源来获取项目信息。今天我们重点讲下招投标平台怎么运营的&#xff0…

python制作标书_爬取比比网中标标书,并保存为PDF格式文件

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 以下文章来源于CSDN&#xff0c;作者嗨学编程 python开发环境 python 3.6 pycharm import requests import parsel import pdfkit import time 相关模块pip安装即可 …

python制作标书_Python爬取比比网中标标书并保存成PDF格式

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 python开发环境 python 3.6 pycharm requests parsel pdfkit time 相关模块pip安装即可 目标网页分析 1、先从列表页中获取详情页的URL地址 是静态网站,可以直接请求…

第一次写标书

由于工作需要开始写起标书。前后大概花了五天时间。 经过自我学习和老师指导&#xff0c;知道了一件事情&#xff0c;不管做什么&#xff0c;其实都是能够有所学习的。 而学习&#xff0c;为了有所收获&#xff0c;需要用心再去体会每一个过程&#xff0c;并记录下来&#xf…

小程序投标书_快来学习招投标小技巧!中标率提高50%(建议收藏)

99%的投标人使用【建企同盟APP】都中标了&#xff01; 建企同盟APP 招标信息不遮挡 订阅推送零费用 从保证中标的因素来看&#xff0c;三个因素最为重要&#xff0c;首先是关系&#xff0c;其次是能力&#xff0c;最后才是价格。关系指与用户的关系&#xff0c;既有最终用户又包…

小程序投标书_程序员接私活常用哪些平台?

给大家推荐国内外几个接外包比较靠谱的平台&#xff0c;相对来说规模和专业性都还不错。 想要接外包或者积累行业人脉的小伙伴都可以收藏一波&#xff1a; 国外篇 如果打算接国外的软件外包&#xff0c;首先以下几点能力需要提前掌握&#xff1a; 基本的英语沟通能力(能够基本沟…