JAVA聊天室(参考实现)_第1页
JAVA聊天室(参考实现)_第2页
JAVA聊天室(参考实现)_第3页
JAVA聊天室(参考实现)_第4页
JAVA聊天室(参考实现)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于java的聊天室的设计与实现 计算机072 周蔓 0708140822第一章 基于java的聊天室设计与实现一、 设计目的:信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。“上网冲浪”“数码相机”“pda”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生

2、巨大影响。聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。在信息世界里,聊天工具的使用是非常频繁的,如msn、qq、校内通,之类的聊天工具许多人都正在使用。此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用java的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。第二章 功能介绍1.需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室

3、将自己融入整个主流社会中。根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1). 与聊天室成员一起聊天,可以与聊天室成员私聊 (3). 可以改变聊天内容风格,用户注册(含头像)、登录(4). 服务器,服务器过滤非法内容。(5). 服务器发送通知,保存服务器日志,保存用户聊天信息。该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、查看在线用户等。2、软件功能描述(1)、用户设置:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)、登录功能:在

4、服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;(3)、公聊:用户可以与“所有人”聊天,在线用户可正常接收并正确显示公聊消(4)、私聊:用在线用户和其他用户聊天。记录对于聊天室的其他用户是不可见的。(5)、聊天心情:用户在聊天的过程中可以选择相应的心情来表达自己的情感。(6)、系统消息:服务端运行,为每一个用户都能接收服务器端发送的信息提示信息。(7)、用户的状态.每一个客户端用户都可以实时看到目前其他在线用户的状态。(8)、用户剔除:用户可以被系统剔除,并重新登记登录名和地址。(9)、用户退出:用户可以在正常情况下退出聊天室。(

5、10)、服务端控制:服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。第三章 主要模块描述及流程图1.模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口socket(tcp)连接。在java中使用套接口相当简单,java api为处理套接口的通信提供了一个类.socket.,使得编写网络应用程序相对容易服务器采用多线程以满足多用户的请求,通过jdbc与后台数据库连接,并通过创建一个appsocket对象来监听来自客户的连接请求,默认ip地址为:默认端口为8888。(1) 聊天室服

6、务端模块图: 聊天室服务端端口服务启动服务停止服务消息显示退出服务器发送系统消息 聊天室服务端模块图 4-1-1端口服务:输入要侦听的端口,默认为8888。启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并聊天。停止服务:关闭服务器,侦听结束。客户端用户不能再聊天。发送系统消息:服务器端给所有人或者个别用户发送消息。消息显示:可以显示所有用户的聊天记录,和上线、下线信息。退出服务器:退出程序,并停止服务。(2) 聊天室客户端模块图聊天室客户端用户设置连接设置退出发送/接收聊天消息用户登录 聊天室客户端4-1-2用户设置:用户可以设置自己的用户名进行聊天。连接设置:用户可以设置

7、自己的服务器的ip,端口号,默认地址为::8888。用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置。用户注销:退出聊天,可以继续修改用户设置和连接设置。发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息。退出:关闭所有聊天并退出客户端。2.流程图 聊天室服务器启动服务端口服务 设置侦听端口 默认端口:8888聊天登录用户设置聊天室客户端 设置用户名 默认连接地址或用户名连接设置退出 设置ip地址和端口 流程图4-1-33.主要类uml关系图:actionli

8、stenerchatserver-port:public static in-serversocket:serversocket-messageshow:jtextarea-userlinklist:userlinklist-showstatus:jtextfield+ chatserver():public+init():public void +startservice():public void+stopservice():public void +sendstoptoall():public void+sendmsgtoall(string):public void+ sendsyst

9、emmessage():public voidjframethreadserverlisten- server: serversocket- userlinklist :userlinklist- isstop: public boolean+serverlisten(serversocket,jcombobox,jtextarea,jtextfield,userlinklist)serverreceive-textarea:jtextarea- userlinklist :userlinklist- isstop: public boolean+serverlisten(serversock

10、et,jcombobox,jtextarea,jtextfield,userlinklist)聊天室服务器端设计:serverlisten- server: serversocket- userlinklist :userlinklist- isstop: public boolean+serverlisten(serversocket,jcombobox,jtextarea,jtextfield,userlinklist)1、聊天室服务器端设计:聊天室服务端主要包括4个文件,它们的功能如下:(1)appserver .java 服务器端进行监听客户端进行服务器的启动,以及端客户进行处理用户退

11、出。(2)serverframe 为服务器端管理界面,负责用户帐号信息保存和用户在线的状态和相关服务器端口的信息以及访问的方式。(3)serverchat.java 负责对用户信息的处理包括公聊和私聊的信息的发送以及将聊天信息的序列化对象填加到保存聊天信息的记事本中。(4)servermessage.java该类是实现服务器端的消息的收发的类。该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。(5)register.java处理用户注册, 用户登录,进行选择自己喜欢的头像和注册相应的信息thread聊天室客户端设计:actionlistenerchatclien

12、t-port:public static in-serversocket:serversocket-messageshow:jtextarea-userlinklist:userlinklist-showstatus:jtextfield+ chatclient():public+init():public void +connect():public void+disconnect():public void +sendmessage():public voidjframeclientreceive- socket: socket-output:objectoutputstream-inpu

13、t:objectinputstream +clientreceive(socket,objectoutputstream,objectinputstream,jcombobox,jtextarea,jtextfield )聊天室客户端主要包括6个文件,其主要功能如下:(1).chatclient.java 为客户端程序启动类,负责客户端的启动和退出。(2).login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。(3).register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。(4).chatroom.java 为客户端程序聊天室主界面,负责接收、发

14、送聊天内容与服务器端的connection.java 亲密合作。(5).windowclose 为chatroom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。(6).clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。六.主要程序代码清单和界面展示:1. 服务器的启动画面以及相应的代码:public class appserver extends thread private serversocket serversocket;private serverframe sframe;private static vector useronline

15、 = new vector(1, 1)private static vector v = new vector(1, 1);创建服务器 启动服务监听8888端口public appserver() sframe = new serverframe();try serversocket = new serversocket(8888);/ 获取服务器的主机名和ip地址inetaddress address = inetaddress.getlocalhost();sframe.txtservername.settext(address.gethostname();sframe.txtip.set

16、text(address.gethostaddress();sframe.txtport.settext(8888); catch (ioexception e) fail(e, 不能启动服务!);sframe.txtstatus.settext(已启动.);this.start(); / 启动线程public static void fail(exception e, string str) system.out.println(str + 。 + e);/监听客户的请求,当有用户请求时创建 connection线程/public void run() try while (true) /

17、监听并接受客户的请求socket client = serversocket.accept();new connection(sframe, client, useronline, v); / 支持多线程/ system.out.println(userlength:+userlength) catch (ioexception e) fail(e, 不能监听!);/启动服务器/public static void main(string args) new appserver();2. 客户端管理界面如下: 服务器端 图 6-1-13. 用户的注册信息主要如下代码: public class

18、 register extends jframe implements actionlistenerprivate jcombobox combobox;private static final long serialversionuid = 9019746127517522180l;jpanel pnlregister;jlabel lblusername,lblgender,lblage;jlabel lblpassword,lblconfirmpass,lblemail,logoposition;jtextfield txtusername,txtage,txtemail;jpasswo

19、rdfield pwduserpassword,pwdconfirmpass;jradiobutton rbtnmale,rbtnfemale;buttongroup btnggender; jbutton btnok,btncancel,btnclear;string strserverip;final jlabel headlabel = new jlabel(); /用于将窗口用于定位dimension scrnsize; toolkit toolkit=toolkit.getdefaulttoolkit(); /构造方法public register(string ip)super(h

20、appychat聊天室注册窗口);strserverip=ip;pnlregister=new jpanel();this.getcontentpane().add(pnlregister);lblusername=new jlabel(用 户 名:);lblgender=new jlabel(性 别:);lblage=new jlabel(年 龄:);lblpassword=new jlabel(密 码:);lblconfirmpass=new jlabel(确认密码:);lblemail=new jlabel(电子邮件:);txtusername=new jtextfield(30);tx

21、temail=new jtextfield(30);txtage=new jtextfield(10);pwduserpassword=new jpasswordfield(30);pwdconfirmpass=new jpasswordfield(30);rbtnmale=new jradiobutton(男,true);rbtnfemale=new jradiobutton(女); btnggender=new buttongroup(); btnok=new jbutton(确定(o); btnok.setmnemonic(o); btnok.settooltiptext(保存注册信息)

22、;btncancel=new jbutton(返回(b);btncancel.setmnemonic(b);btncancel.settooltiptext(返回登录窗口);btnclear=new jbutton(清空(l);btnclear.setmnemonic(l);btnclear.settooltiptext(清空注册信息);try /连接到服务器 socket toserver; toserver = new socket(strserverip,8888); objectoutputstream streamtoserver=new objectoutputstream (to

23、server.getoutputstream(); /写客户详细资料到服务器socket streamtoserver.writeobject(register_customer)data); /读来自服务器socket的登陆状态 bufferedreader fromserver=new bufferedreader(new inputstreamreader(toserver.getinputstream(); string status=fromserver.readline(); /显示成功消息 joptionpane op=new joptionpane(); op.showmess

24、agedialog(null,status); if(status.equals(data.custname+注册成功) txtusername.settext(); pwduserpassword.settext(); pwdconfirmpass.settext(); txtage.settext(); txtemail.settext(); /关闭流对象 streamtoserver.close(); fromserver.close(); catch(invalidclassexception e1) joptionpane.showmessagedialog(null,类错误!);

25、catch(notserializableexception e2) joptionpane.showmessagedialog(null,对象未序列化!); catch(ioexception e3) joptionpane.showmessagedialog(null,不能写入到指定服务器!); /方法register()结束public static void main(string args)new register(); /class register 结束聊天注册窗口图6-1-24.聊天室登录主要代码:/ title: happychat聊天系统登录程序/desc

26、ription: 根据指定的服务器地址、用户名和密码登录聊天服务器/public class login extends jframe implements actionlistenerprivate static final long serialversionuid = -8965773902056088264lprivate jpanel pnllogin;private jbutton btnlogin, btnregister, btnexit;private jlabel lblserver, lblusername, lblpassword, lbllogo;private jt

27、extfield txtusername, txtserver;private jpasswordfield pwdpassword;private string strserverip;/ 用于将窗口定位private dimension scrnsize;private toolkit toolkit = toolkit.getdefaulttoolkit() / 构造登陆窗体/public login() super(登录happychat聊天室);pnllogin = new jpanel();this.getcontentpane().add(pnllogin);lblserver

28、= new jlabel(服务器(s):);lblusername = new jlabel(用户名(u):);lblpassword = new jlabel(密 码(p):);txtserver = new jtextfield(20);txtserver.settext();txtusername = new jtextfield(20);pwdpassword = new jpasswordfield(20);btnlogin = new jbutton(登录(l);btnlogin.settooltiptext(登录到服务器);btnlogin.setmnemoni

29、c(l);btnregister = new jbutton(注册(r);btnregister.settooltiptext(注册新用户);btnregister.setmnemonic(r);btnexit = new jbutton(退出(x);btnexit.settooltiptext(退出系统);btnexit.setmnemonic(x);/ 设置登录窗口setresizable(false);setsize(340, 260);setvisible(true);scrnsize = toolkit.getscreensize();setlocation(scrnsize.wid

30、th / 2 - this.getwidth() / 2, scrnsize.height/ 2 - this.getheight() / 2);image img = toolkit.getimage(imagesappico.jpg);= ae.getsource();if (source.equals(btnlogin) / 判断用户名和密码是否为空if (txtusername.gettext().equals()| pwdpassword.gettext().equals() joptionpane op1 = new joptionpane();op1.showmessagedia

31、log(null, 用户名或密码不能为空); else strserverip = txtserver.gettext();login();if (source.equals(btnregister) strserverip = txtserver.gettext();this.dispose();new register(strserverip);if (source = btnexit) system.exit(0); / actionperformed()结束/ 登录事件响应方法/suppresswarnings(deprecation)public void login() / 接受客

32、户的详细资料customer data = new customer();data.custname = txtusername.gettext();data.custpassword = pwdpassword.gettext();try / 连接到服务器socket toserver;toserver = new socket(strserverip, 8888);objectoutputstream streamtoserver = new objectoutputstream(toserver.getoutputstream();/ 写客户详细资料到服务器socketstreamtos

33、erver.writeobject(customer) data);/ 读来自服务器socket的登录状态bufferedreader fromserver = new bufferedreader(new inputstreamreader(toserver.getinputstream();string status = fromserver.readline();if (status.equals(登录成功) new chatroom(string) data.custname, strserverip);this.dispose();/ 关闭流对象streamtoserver.clos

34、e();fromserver.close();toserver.close(); else joptionpane.showmessagedialog(null, status);/ 关闭流对象streamtoserver.close();fromserver.close();toserver.close(); catch (connectexception e1) joptionpane.showmessagedialog(null, 未能建立到指定服务器的连接!); catch (invalidclassexception e2) joptionpane.showmessagedialog

35、(null, 类错误!); catch (notserializableexception e3) joptionpane.showmessagedialog(null, 对象未序列化!); catch (ioexception e4) joptionpane.showmessagedialog(null, 不能写入到指定服务器!); / login()结束 / 启动登陆窗体public static void main(string args) new login(); / class login结束5.聊天室登录界面:6.聊天界面代码:public class chatroom exten

36、ds thread implements actionlistener private jcombobox daxiaocombobox;private jcombobox yangshicombobox;private jcombobox ziticombobox;private jcombobox emote;static jframe frmchat;jpanel pnlchat;jbutton btncls, btnexit, btnsend, btnclear, btnsave, btntimer;jlabel lbluserlist, lblusermessage, lblsend

37、message, lblchatuser;jlabel lblusertotal, lblcount, lblback;jtextfield txtmessage;java.awt.list lstuserlist;textarea tausermessage;jcombobox cmbuser;jcheckbox chprivatechat;string strserverip, strloginname;thread thread;final jlabel headlabel = new jlabel();/ 构造方法public chatroom(string name, string

38、ip) / dialog d = new fontdialog();strserverip = ip;strloginname = name;frmchat = new jframe(聊天室 + 用户: + name + );pnlchat = new jpanel();frmchat.setdefaultcloseoperation(jframe.exit_on_close);frmchat.getcontentpane().add(pnlchat);font fntdisp1 = new font(宋体, font.plain, 12);string list = 所有人 ;btncls

39、= new jbutton(清屏(c);btnexit = new jbutton(退出(x);btnsend = new jbutton(发送(n);btnsave = new jbutton(保存(s);btntimer = new jbutton(时钟(t);lbluserlist = new jlabel(【在线用户列表】);lblusermessage = new jlabel(【聊天信息】);lblsendmessage = new jlabel(聊天内容:);lblchatuser = new jlabel(你对:);lblusertotal = new jlabel(在线人数:

40、);lblcount = new jlabel(0);lstuserlist = new java.awt.list();txtmessage = new jtextfield(170);cmbuser = new jcombobox(list);/ chenmincmbuser.additemlistener(new itemlistener() public void itemstatechanged(itemevent arg0) freshhead(););chprivatechat = new jcheckbox(私聊);tausermessage = new textarea(,

41、300, 200,textarea.scrollbars_vertical_only);/ 只能向下滚动/ tausermessage.settext(aaaaaa汉字aaaa);tausermessage.setforeground(new color(0, 0, 0);tausermessage.seteditable(false); / 不可写入emote.setmodel(new defaultcomboboxmodel(new string 表情, 微笑,甜笑, 惊喜, 嘻嘻, 扮酷, 嘿嘿, 傻笑, 好奇, 媚眼, 鬼脸, 陶醉,想想 );emote.setbounds(141,

42、301, 60, 23);pnlchat.add(emote);ziticombobox = new jcombobox();ziticombobox.additemlistener(new itemlistener() public void itemstatechanged(itemevent arg0) freshfont();boolean isfirstlogin = true; / 判断是否刚登陆boolean isfound; / 判断是否找到用户vector user_exit = new vector();try / socket toserver;/ toserver =

43、new socket(strserverip, 8888);for (;) socket toserver;toserver = new socket(strserverip, 8888);/ 将信息发往服务器messobj = new message();objectoutputstream streamtoserver = new objectoutputstream(toserver.getoutputstream();streamtoserver.writeobject(message) messobj);/ 收来自服务器的信息objectinputstream streamfroms

44、erver = new objectinputstream(toserver.getinputstream();messobj = (message) streamfromserver.readobject();/ /刷新聊天信息列表/if (isfirstlogin) / 如果刚登陆intmessagecounter = messobj.chat.size(); / 屏蔽该用户登陆前的聊天内容isfirstlogin = false;if (strloginname.equals(messobj.ti) / tausermessage.append(ni bei ti);exitchatro

45、om();joptionpane.showmessagedialog(null, strloginname+ 你被管理员剔除!);if (!servermessage.equals(messobj.servermessage) servermessage = messobj.servermessage;tausermessage.append(系统消息: + servermessage+n);/ tausermessage.settext();for (int i = intmessagecounter; i messobj.chat.size(); i+) chat temp = (chat

46、) messobj.chat.elementat(i);/ chenminstring emote = temp.emote;if (emote.equals(表情) emote = ; else emote += 地;string temp_message;if (temp.chatuser.equals(strloginname) if (temp.chattouser.equals(strloginname) temp_message = 系统提示您:请不要自言自语! + n; else if (!temp.whisper) / 不是悄悄话temp_message = 【你】对【 + t

47、emp.chattouser + 】+ emote + 说: + temp.chatmessage+ n; else temp_message = 【你】悄悄对【 + temp.chattouser+ 】 + emote + 说: + temp.chatmessage+ n; else if (temp.chattouser.equals(strloginname) if (!temp.whisper) / 不是悄悄话temp_message = 【 + temp.chatuser + 】对【你】+ emote + 说: + temp.chatmessage+ n; else temp_message = 【 + temp.chatuser + 】悄悄对【你】+ emote + 说: + temp.chatmessage+ n;temp_message = 【 + temp.chatuser + 】对【+ temp.chattouser + 】 + emote+ 说: + temp.chatmessage + n; else temp_message = ; else temp_message = ;tausermessage.append(temp_message);intmessagecounter+;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论