登陆界面

注册账号

找回密码

重设密码

聊天界面

多人聊天

一、 设计任务

1.1设计意义

《Java基础入门》课程设计是对学生的一种全面综合训练,它包括问题分析,用户界面设计,程序设计基本技能和技巧,多人合作。课程设计是比平时的习题复杂,也更接近实际,使学生学会如何把书本学到的知识应用于解决问题上,使书上的知识变活。同学录作为一种方便同学之间的联系的使用系统应运而生,为同学之间进行交流和联系提供一个平台。通过提供完善的同学录服务和规范同学录的管理,可以达到增进同学之间、同学与母校之间的情感,方便校友联系的目的。

1.2设计目的

1.全面熟悉和掌握所学到的Java语言知识和技能,运用多线程、网络编程、JDBC、GUI、集合以及数组、函数等方法,同时也需要运用Mysql等相关知识完成聊天小程序。

2.巩固基本知识,验证自身的学习效果,进一步提高上机动手能力,培养使用计算机解决问题的技巧,为以后的学习奠定基础。

1.3设计任务

聊天小程序是典型的TCP示例系统,根据所学知识,用面对对象、多线程、GUI、集合、JDBC等知识相结合,实现聊天小程序的登陆界面、注册界面、找回密码界面、聊天界面,以及每个界面的一些详细功能,并建立数据库做出数据的交汇,能够实现聊天界面的多人聊天和私人聊天。

要求: 1)使用图形用户界面;;

2)能实现一个聊天室多人聊天

3)可以两人私聊;

二、 需求分析

2.1功能需求分析

2.1.1用户界面分析

分为登陆界面、注册账号界面、找回密码界面和聊天界面。

2.1.2用户功能分析

实现用户注册、密码找回、记住密码、夜间模式、用户登录、聊天等主要功能。

用户注册:用户通过设置昵称,账号,密码和密保上传到数据库以实现登录,如果账号已被注册已存在会提醒账号已存在,并重新注册。

密码找回:用户通过输入账号,并根据注册账号时填写的密保信息进行匹配,匹配上后则会提供用户修改密码。若密码错误或者密码不存在会做出相应提示。

记住密码:用户在登陆前通过勾选“记住密码”复选框,并成功登录,则会把账号和密码信息保存在remember表里,下次打开登陆界面后就会把用户信息填充到下拉框和密码框里。已经保存过的,不会重复保存。

夜间模式:用户登陆前通过勾选“夜间模式”复选框,就会切换登陆界面和聊天界面黑色的背景颜色。

用户登录:用户通过输入账号和密码以匹配数据库表里的信息,输入信息错误会做出相应提示。

聊天:有好友上线会添加到好友列表,下线会从列表里移除,并会收到好友上下线的信息通知,通过选着好友会切换到相对的文本域,以实现聊天信息分离,并在JList列表框里有群聊选项以实现公共聊天。

2.2数据需求分析

数据库包含两个表,分别是login还有remember,分别储存用户注册信息,用来对用户登录进行判断,并对用户申请找回密码提供数据依据;和用户选择记住密码的帐号密码信息,用来下次打开登陆界面直接有账号和密码填充。

三、 系统设计

3.1概要设计

3.1.1登录界面

该界面是确认用户信息,如果用信息不匹配,则会提醒信息错误,这时可以通过注册按钮功能注册用户信息,或者通过找回密码按钮来更改密码;另外,如果一个账号已经登陆过。系统会阻止该账号的再次登录。

3.1.2主界面

该界面是通过JscrollPane滚动面板面板、JList列表、JTextarea文本域,并把JList列表和JTextarea文本域添加到JscrollPane来实现“朋友列表”、“消息显示文本域”、“消息输出文本域”、“消息通知”。JLIst列表里存放在线用户,并通过选择“朋友列表”中的不同用户获取与之对应的“显示文本域”,并通过TCP协议、多线程实现每个人的聊天信息的分离。并设有“发送”和“清空”两个按钮,并添加了对应的监听事件,前者用于把“消息输出文本域”上的信息显示到显示“消息显示文本域”上,收到消息的用户会在“消息通知”显示收到消息的来源和时间,后者用于清除过多的消息通知。

3.2 详细设计

3.2.1 MainWindow和CreateJpanel类

MainWindow类中有mian方法,通过调用CreateJpanel类中的方法来实现登陆界面,而CreateJpanel类里就是具体实现登陆界面的代码,用JPanel面板分为五行,一次存放了聊天小程序的图标、账号登录下拉框、密码框、记住密码和夜间模式复选框以及登录注册还有找回密码按钮,每一行就是一个方法,然后最后再把这这五个面板放到一个大面板中以更好的实现后面的“夜间模式”功能。

CreateJpanel类中的方法:

fistline(JFrame frame)、secondline()、thirdline()、forthline()、fifthline(JFrame frame)功能:分别用于创建登陆界面的一到五行。其中第三行对下拉列表框做了事件监听,当选中列表框里保存的账号时密码框便会设置为与之匹配的密码,对密码框加了焦点监听器,当密码框获得鼠标焦点的时候下边框便会加粗变蓝以增加体验,还实现按回车键点击登录按钮的效果,对密码框后面的密码显示按钮添加了动作事件,以便点击之后可以实现对密码的隐藏和显示;第四行对“记住密码”和“夜间模式”两个按钮加了事件监听以判断是否被选择;第五行对“注册账号”和“找回密码”两个按钮加了自定义监听,以便于点击之后可以分别跳转到注册账号和找回密码界面,并且还对两按钮添加了鼠标监听器,以实现当鼠标移入字体变蓝的效果,增强体验,对“登录按钮”也添加了自定义监听,并当鼠标移过时会更换按钮图标以增强体验。

adduser()功能:调动数据库的remember表格,把用户曾选择记住密码的账号添加到下拉列表框。

3.2.2 My_combox、My_Jlist、My_ScrollPane、SetBaseConnect类

前三个类分别继承了JComboBox、JList、JScrollPane,主要是对这些组件进行美化,如My_combox就是美化了下拉列表框右方的按钮,My_Jlist则是使得Jlist列表里的选项可以居中显示,并改变了其字体样式,而My_ScrollPane美化了滚动面板的滚动条,隐藏了滚动条的按钮并重新绘制了滑块。而SetBaseConnect类则是用来与数据库建立连接的类,其中定义了Connection getconn()方法用来建立数据库连接,当连接失败会提示数据库连接失败,还有close(Connection conn,PreparedStatement ps)方法用来关闭连接并释放资源。

3.2.3 RegisterWindow、RetrievepassWindow类

这两个类都实现了ActionListener接口,达到自定义监听事件的目的。

RegisterWindow类是注册账号的界面,与登陆页面的“注册账号”按钮绑定,进入界面需要按要求填写相应信息进行注册账号,若填写信息不对则会有相应的提示,并对输入账号和密码的文本框加了键盘监听器,前者只允许输入数字,后者只允许输入数字和字母。对提交按钮加了事件监听器,当所有信息填写符合要求便会连接数据库对用户注册信息进行保存,如果注册账号已经存在会做出提示。类中有一个addFocusListener(JTextField text,String hintText)方法,用来给输入框添加提示,当输入框没有获得焦点并且框内没有输入字符时便会使提示信息显示于输入框内,并且当鼠标悬浮于输入框之上也会获得提示信息。

RetrievepassWindow类是找回密码的界面,与登陆界面的“找回密码”按钮绑定,进入页面需要填写要找回密码的账号,并需填写注册账号是填写的密保信息以确定用户身份,填写错误会有相应的错误提示,信息填写正确会进入新的界面来对密码进行修改。类中调用了RegisterWindow类的addFocusListener(JTextField text,String hintText)方法,对所有的输入框添加了文本提示。

3.2.4 User、Server、Sockets类

User类是用于创建用户对象的类,其内有私有的name、id、sock私有变量并且有对应的set、get方法。

Server类是聊天小程序的服务器实现类,有着在线用户ArrayListuserlist和输出流ArrayListlist这两个重要的集合,定义了最终的端口号为6666,类中有着一个Main内部类,该内部类实现了Runnable接口,构造方法需要一个socket,在重写的run方法中用socket获取包装了一个缓冲区输入流,不断接收客户端发来的请求并作出相应的回复。getServer()方法用来创建服务器,并在while(true)中不断接收客服端的连接请求,然后创建客户的输出流添加至输出流集合,并打开该客服的服务线程。sendMessage(String message)方法是遍历输出流集合,以实现群发功能。

Sockets类是聊天小程序客户端的实现类,类中有一个Part内部类,构造方法需要一个socket,在重写的run方法中用socket获取包装了一个缓冲区输入流,不断接收服务器发来的命令并在主页面做出相应的行动。Sockets的构造方法中添加了建立socket连接,创建并打开客户端线程的语句。

3.2.4 OnloginWindow类

该类是主页面即聊天页面的实现类,该类实现了ActionListener接口,达到自定义监听事件的目的,并与登陆界面的“登录”按钮绑定,重写的actionPerformed(ActionEvent e)方法中实现对登陆界面账号和密码信息的判断,信息错误会有相应的提示,输入信息正确则会调用相应的方法切换到聊天主页面。(我在其中加了四个测试账号,以便不连接数据库也能登录)

getOnloginWindow(String name, String id, boolean black)方法,在repeatlogin(String name, String id, String password, boolean black)方法中被调用,用于获取聊天页面,方法需要三个参数,第一个是用户的昵称,第二个是用户的账号,第三个是登陆界面“夜间模式”复选框是否勾选的标识,若勾选会更改背景颜色为灰色。

sock()方法,创建了客户端对象,并创建输出流,发送好友列表标识、上线标识和相应的请求,在方法中还对发送按钮还有窗口加了监听,分别发送了发送信息标识和下线标识。

repeatlogin(String name, String id, String password, boolean black)方法,该方法通过服务器遍历在线用户集合,若重复登录就发送给客户端“repeat”标识,然后客户端把OnloginWindow类的静态布尔变量flage的值改为true,来实现防止同一账号多次登录。这个方法还会判断CreateJpanel类中的静态布尔变量remember的值来确定登录界面的“记住密码”复选框是否被选中,如果被选中则会把方法传入的id和password保存到数据库remember表中,已经保存过的不会重复保存。

四、 系统实现

4.1登录窗口

登录界面主要是用于确定用户身份;调用其他窗体的一个操作界面,输入账号,密码,点击“登录”按钮,连接MySQL数据库,用select语句在表user中查询是否账号和密码是输入的记录,查询到得到关闭登录窗口,显示系统主界面;没有查询到弹出消息框提示相应的输入信息错误。点击“注册账号”进入注册账号页面,点击“找回密码”进入找回密码页面。

4.2注册账号窗口

进入该窗口依次填写注册信息,填写错误会有错误提示,账号存在也会有提示,成功注册会把注册信息保存在数据库的login表中。

4.3找回密码窗口

依次填写账号和对应的密保信息,信息错误会有相应提示,正确会弹出修改密码的窗口。 重新设置密码即可。

4.4聊天窗口

在该页面可点击朋友列表的群聊,对所有在线朋友发送群聊信息,也可以选择某位朋友,对其私聊。

五、 总结

5.1聊天功能的具体实现总结

主要是 Server类、Sockets类和OnloginWindow类来实现,每次登陆时调用OnloginWindow类中的sock()方法,创建客服端对象,然后服务器接收到连接请求,在sock()方法中创建客户的输出流,发送“friendlist”好友列表标识,并把用户的昵称账号信息连接成字符串以分隔符分开发,送服务器端有专门的输入流不停读取客户端发来的匹配表示,当读到“friendlist”时便会把收到的信息以分隔符分割成数组储存,然后遍历在线用户集合,判断该用户是否已经登陆。若已经登陆会发给客户端“repeat”标识,关闭该socket,并改变使判断用户是否已经登陆的静态标识为true,通过OnloginWindow类中的repeatlogin方法进行判断从而防止重复登录;若该用户还未登录,就发送给客户端“frendlist”标识,并把已经登陆过的用户信息连接成字符串发送该该客服端,然后再发送“norepeat”的标识发给客户端,客户端读到“friendlist”标识便把收到的用户信息添加到好友列表中,读到“norepeat”标识就把判断用户是否已经登陆的静态标识的值改为false。

接着客户端继续发送“add”标识,以告诉其他用户自己已上线,把自己的信息加入其他在线客户列表中,服务器读到“add”便会遍历输出流集合,循环条件为0~长度减2,即对除去自己外其他所有在线用户的输出流发送“add”和昵称账号信息,并发送“notice”标识和上线通知,读到“add”和“notice”标识的用户便会把读到的用户信息添加到自己的好友列表中,并在消息通知栏中显示好友上线通知。

当客户端选中好友列表中的“群聊”选项时便会输出“public”标识,然后服务器便会调用sendMessage群发方法,发送给每个客户端“public”标识,并发送聊天信息,然后发送“notice”消息通知标识,对每个用户发送收到群信息提示,客户端收到服务器发来的“public”标识后就把聊天信息显示在每个客服聊天界面群聊显示文本域上面,读到“notice”。

当客户端选中好友列表某一好友选项时,就会向服务器发送“private”私密聊天标识,并发送聊天两者的用户信息和聊天内容,服务器读到“private”标识后会把发送者的信息和接受者的信息还有聊天信息分隔开,然后遍历在线用户集合,以匹配发信息用户和接收信息用户,对发信息的用户发送“privateOrigin”发送者标识,并发送“你对…说…”,对接收信息的用户发送“notice”消息通知标识,告知该用户收到谁发来的消息,以便该用户切换到该用户的消息框读取消息,然后发送“privateTarget”接收者标识,并发送“…对你说…”,对应的客户端收到这两个标识时便会把消息显示在相应的显示信息文本域上。

当客户端退出聊天页面时,便会向服务器发送“exit”退出标识,并发送用户信息,服务器读到“exit”标识后就会从在线用户集合和输出流集合中移除该用户的信息,关闭该用户的socket,群发“exit”退出标识和该用户信息,并群发“notice”标识通知该用户下线,其他用户读到“exit”标识后就会把该用户移除好友列表,读到“notice”标识就会把该用户下线信息显示到消息通知栏里。

5.2设计总结

通过这次课程设计我收获到了很多,用于实现聊天小程序的很多知识都是书上不曾学习过的,比如JList列表,Jcombox的美化等等,每有一个不会的未曾学习到的方法,我都要上网先把这部分知识学习一遍,然后再做试验,最后添加到代码中来,其中用了时间很长的部分便是一些组件的美化,还有针对每个用户聊天时可以切换聊天框面板的功能,最后就是放重复登陆的功能,我反复实验、学习,最终得以时实现,做完课程设计,我提高最大的就在多线程、GUI、还有网络编程这一块,对它们的学习有了更深的了解和认知,当然,这次课程设计也没有达到我想象中的样子,终究是学习知识有限,就比如聊天室能实现像QQ微信一样,能有聊天气泡、能够发送文件还有图片,这些都还需要我接下来的学习才能实现,我下面也会逐步的完善它,丰富它的功能。

作者:长头发的程序员

javaweb通过iis实现域账号免登陆_聊天小程序的Java实现相关推荐

  1. java实现微信、手机号登陆_微信小程序获取手机号授权用户登录功能

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPaDirIrkFhoneNumber这个组件通过button来 ...

  2. 一起来做个免登录资源导航小程序!

    免费编程资源大全:https://github.com/liyupi/free-programming-resources 今天,一起来开发个资源导航微信小程序吧,要实现的功能很简单,就是所有用户都可 ...

  3. 小程序下单账号与支付账号不一致不让支付_微信小程序支付流程

    微信支付之小程序支付 微信的支付方式有以下几种,不同的支付方式适用于不同的支付场景,而今天要给大家讲的就是 小程序支付 方式 说到支付功能就要涉及到金钱交易,必定是有比较严格的规范及流程,如要求小程序 ...

  4. 注册登录页面代码用js判断是否填入信息_微信小程序快速开发:从注册账号到小程序上架

    写在前面 自从微信小程序功能发布后,我就一直关注着小程序的动向,然而限于学业繁忙,总是没有太多的时间去学习.大二逐渐学习了Vuejs,被其简洁的设计所吸引,后来看了看小程序的开发文档,发现这么的相似? ...

  5. 微信公众账号后台怎么解除小程序_微信小程序解除绑定 微信小程序怎么授权...

    该如何注销小程序? 微信小程序目前无法取消,也是微信小程序最脆弱.最无助的地方.如果你确定你不想要这个小程序,你可以转移和改变主题和其中的所有信息,这样你的小程序就会变成别人的小程序,与你无关.相当于 ...

  6. 微信公众账号后台怎么解除小程序_微信小程序 后台登录(非微信账号)实例详解...

    微信小程序 后台登录 实现效果图: 最近写了一个工具类的小程序,按需求要求不要微信提供的微信账号登录,需要调取后台登录接口来登录.由于小程序大部分都是调取微信信息登录,很少有调用自己后台来登录的,所以 ...

  7. 微信聊天小程序——(二、账号的注册与登录)

    具体效果: 目录 二.账号的注册与登录 步骤一.获取用户信息 步骤二.用户输入账号密码(在注册页面中) 步骤三.将获取到的值放到我们的数据库中(在注册页面中) 步骤四.登录的页面逻辑 步骤五.登录页面 ...

  8. 小程序加入人脸识别_微信小程序 人脸识别登陆模块

    微信小程序---人脸识别登陆的实现 关键词:微信小程序 人脸识别 百度云接口 前言 这是一篇关于一个原创微信小程序开发过程的原创文章.涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口.小程序的 ...

  9. wordpress账号无法登陆_解决WordPress后台管理用户无法登陆且一直停留在登录界面问题...

    下午的时候,有一位网友联系老左问是否有遇到管理员用户无法登陆WordPress问题,之前我只接触过密码如果错误肯定是登录不了的,且这位朋友登录后的迹象是一直停留在登录界面也不提示密码错误,根据常规输入 ...

最新文章

  1. 《庆余年》里范闲背了个诗,把这个GitHub项目带火了
  2. 三分钟黑了阿里?马云下死命令留他?吴翰清辟谣:我没黑过阿里
  3. UML图系列——建模和面向对象
  4. python hello world重复_从hello world开始学Python
  5. [ 转载 ] Java面试精选【Java基础第一部分】
  6. php orm教程,Laravel ORM 数据model操作教程
  7. 测试员:你知道未来移动测试的方向是什么样的吗?
  8. net_sf_interfacecpp项目诞生宣言
  9. 过山车之星(Planet Coaster)的视角和编辑介绍
  10. [Asp.Net WebApi]WebApi入门
  11. 实现原理 扫描枪_扫描枪原理
  12. JS实现网页截图的三种方案
  13. 翻牌记忆类H5游戏的春天
  14. mysql数据库拒绝访问的解决过程_记一次MySQL数据库拒绝访问的解决过程
  15. 霸榜巨作、阿里内部顶级专家整理(Redis 5设计与源码分析)
  16. 大数据与云计算技术周报(第148期)
  17. 彻底消除电脑中的流氓软件与广告弹窗
  18. 漫画中国式项目管理重点总结
  19. java游戏spa,【Vue的路由,SPA概念】
  20. 迷宫游戏(wap页游还原)-JavaScript实现

热门文章

  1. 修ecshop品牌筛选以LOGO图片形式显示
  2. c#中高效的excel导入oracle的方法
  3. 【转】查看linux服务器的系统信息
  4. JavaScript操作select下拉菜单全集合
  5. UVA558 LA5579 Wormholes【Floyd算法】
  6. 2015 ACM/ICPC Asia Regional Changchun Online题解
  7. 部分和(partial sum)在算法求解中的作用
  8. 物理学基石 —— 波、电磁波、微波
  9. Trick(十六)—— 随机数的生成
  10. Python 数据结构与算法——二叉搜索树的实现