聊天小程序的Java实现 java聊天小程序课程设计
一、 设计任务
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<String>、JList<String>、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类是聊天小程序的服务器实现类,有着在线用户ArrayList<User> userlist和输出流ArrayList<PrintWriter> list这两个重要的集合,定义了最终的端口号为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微信一样,能有聊天气泡、能够发送文件还有图片,这些都还需要我接下来的学习才能实现,我下面也会逐步的完善它,丰富它的功能。
作者:长头发的程序员