文章目录

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

学习了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】【消息内容】

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

六、项目缺点

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

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

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

  1. C#仿qq窗体项目 登录 注册 聊天 点赞 更换头像 添加好友 删除好友 基础功能

    C#仿qq窗体项目 登录 注册 聊天 点赞 更换头像 添加好友 删除好友 基础功能这里写自定义目录标题 话不多说直接上图片: 学校第一学期结业项目 采用环境: sqlserver2008 vs2010 ...

  2. Java仿QQ客户端(用JTree实现好友列表)

    仿QQ客户端 当前效果 登录界面 好友列表界面 当前效果 登录界面 首先,为了达到美观的目的,需要添加一张背景图片,我采用的方法是将图片添加到JLabel上,再将JLabel添加到界面上,但这样会面临 ...

  3. java 实现 仿QQ聊天系统 简易地实现 网络 在线聊天 代码详解(附源代码)

    首先,实现的效果如下图:  这是一个非常经典的例题,几乎在每本程序语言入门书中都会涉及到一部分原理的讲解.我在这里简单地介绍一下代码的实现,让刚学习网络编程的读者更好的理解和实现,二来加深自己的记忆. ...

  4. java聊天软件课程设计_[计算机课程设计] JAVA课程设计-聊天室

    本系统基于C/S模式. 新的时代,新的世纪,在当今这个发达的信息时代,网上办公,极为普遍,生活变的简单化,人们在家就可以办公,是信息化时代的标志.我经过多方的调查和研究,并灵活运用了自己所学的知识,编 ...

  5. android 仿QQ五毛特效之查看红包领取详情界面

    这篇是15年写的 没有审核成功,今天看到,重新发布了下,没想到发布成功了~~! 首先我们看下 上下滑动的效果     从左到右依次为 往上滑动的截图 发现在滑动的过程中可以发现以下3点: 1. 发起者 ...

  6. java 仿qq庅_[源码和文档分享]基于java 的仿QQ聊天工具

    一 需求分析 本系统是基于java开发的聊天室.有用户注册.用户登陆.修改密码.忘记密码.添加好友.用户聊天.群聊功能.如果服务器还没有启动,则客户端是不可以登陆.注册.忘记密码,如果在运行过程中,服 ...

  7. Android_聊天软件_加好友_与服务器交互

    番外篇: 1.在做界面时,总遇到输入键盘不能自己收起,导致需要手动收起键盘,使操作多一步,现在说一下我的流程, 检查键盘是否显示,代码如下: private Context mContext;priv ...

  8. Android 仿QQ动态背景登录

    记得前阵子高考的那段时间,发现QQ的登录背景是会动的,看起来逼格很高.而今天也来带领大家去实现这样一个逼格很高的 动态登录背景. 之前网上看到有一些也实现了这样的功能,但基本只是给了个按钮表示一下,然 ...

  9. android聊天软件大报告,大改变聊天app下载-大改变聊天神器预约 安卓版v1.0-PC6安卓网...

    大改变聊天神器APP是一款专业的恋爱话术软件,大改变聊天app不仅可以教你如何撩妹,大改变聊天app还能教你如何追男神.女神,各种场景下适用的话术应有尽有,让你快速成为高情商人士. 软件介绍 大改变聊 ...

  10. python实现简易聊天需要登录_python编写简易聊天室实现局域网内聊天功能

    本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下 功能: 可以向局域网内开启接收信息功能的ip进行发送信息,我们可以写两段端口不同的代码来实现在一台电脑上与自己 ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型
  2. html5游戏加载动画,HTML5 战场3游戏的加载指示动画
  3. oracle数据库解决system表空间已爆满的问题
  4. javascript 调用c#变量实例
  5. 程序员修神之路--高并发系统设计负载均衡架构
  6. P3402-[模板]可持久化并查集【主席树】
  7. Proxy Pattern using C# (转载)
  8. java注释 param_@Param注解的用法解析
  9. mybaties :required string parameter ‘XXX‘is not present
  10. 为什么使用getrequestdispatcher跳转出现404_网站出现404错误时的处理方法
  11. 20、自动装配-@Autowired@Qualifier@Primary
  12. 【论文解读】LGN: 基于词典构建的中文NER图神经网络
  13. 软件测试理论试题及答案
  14. HTML静态网页作业——仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  15. 注销 睡眠 休眠的区别
  16. 一级计算机电子表格人,计算机一级电子表格.doc
  17. C# 读取Excel表格内图片
  18. mpvue设置每个页面的标题,网上找的暴漏config对象的方法已经不能使用
  19. 163邮箱登录跳转php源码,网易等邮箱网页登陆源代码.doc
  20. Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)

热门文章

  1. 数学建模—降维—因子分析
  2. 用pycharm写python_在PyCharm中使用VPython
  3. 51单片机五层电梯控制器 基于51单片机的五层电梯控制系统
  4. MySQL:递减/递减更新一列字段值
  5. c语言,计算a+aa+aaa+......,使用函数定义的方法
  6. 金蝶K3WISE常用数据表
  7. 抖音作品和直播间如何获取更多流量
  8. Android Listview滑动时不加载数据,停下来时加载数据,让App更优
  9. 英语语法总结---三、英语中三个特殊句式是哪三个
  10. RPM打包过程及spec文件解释