版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一需求分析聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务: 服务器端应当建立一个serversocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。 服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。 以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。客户端应该完成的工作包括:与服务器端建立通信通道,向服务器端发送信息。接收来自服务器的信息。相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,
2、解决上述四个问题,即完成了该聊天系统的核心。二概要设计 运用所学的编程知识,加上网络方面的一些知识结构,模拟qq聊天工具,通过socket编写的简易网络聊天工具。socket,简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个socket建立连接,客户端通过写socket来通知服务器,以读socket中的
3、信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个socket,通过读写和客户端通信。socket程序的工作过程:1、建立socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。2、数据通信:利用虚拟连接通道传送数据信息进行通道。3、关闭:通信结束时,再将所建的虚拟连接拆除。具体如下:服务器1服务器socket2监听4接收5读6写7关闭3客户端etsocket6 写5 读7关闭 三次握手:第一次握手:原主机发送一个带有本次连接的序号的请求的一个数据帧第二次握手:目的主机收到请求后,如果同意连接,则发
4、回一个带有一个本次连接序号和源端机连接序列号的确认。第三此握手:源端机收到含有两次初始序列号的应答后,在向目的主机发送一个带有两次连接的序列号的确认。具体过程如下ack=1第一次握手,主机a向主机b发送连接请求第二次握手,主机b收到主机a的请求,向主机a回发一个确认,同时向主机a发送一个连接请求第三次握手,主机a收到主机b发送的数据包在向主机b发送一个确认连接主机a 主机back=1,syn=1,seq=aaaaaaaaaasyn=1,seq= 基于udp点对点聊天的设计要点:1、实现思想在internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以
5、与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在tcp/ip环境下,实现服务器端和客户端两部分程序。2、服务器端工作流程服务器端通过socket()系统调用创建一个socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空socket,将客户端地址赋给这个socket。然后登录成功的客户就可以在服务器上聊天了。3、客户端工作流程客户端程序相对简单,只需要建立一个socket与服务器端连接,成功后通过这个socket来发送和接收数据就可以了。三详细设计(1)服务
6、器程序模块服务器与客户间通过套接口socket(tcp)连接。在java中使用套接口相当简单,java api为处理套接口的通信提供了一个类.socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个serversocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。服务器线程源码:package qq.server;import java.io.ioexception;import java.io.objectinputstream;import java.io.objectoutputstre
7、am;import .socket;import java.util.*;import qq.dao.hibernate.iservicedao;import qq.entity.*;public class servercontroller private user user;private socket s;private iservicedao dao;private objectinputstream ois;private objectoutputstream oos;private onlineuser onlineuser;public servercontroller(sock
8、et s) super();dao=servermainclass.userdao;this.s = s;public void handle() throws exception ois=new objectinputstream(s.getinputstream();oos=new objectoutputstream(s.getoutputstream();onlineuser=new onlineuser(ois,oos);while(true)request req=(request)ois.readobject();ois.read();requesttype type=req.g
9、ettype();if(type.equals(requesttype.exit)exithandle();break;else if(type.equals(requesttype.login)loginhandle(req);else if(type.equals(requesttype.register)registerhandle();else if(type.equals(requesttype.offline)offlinehandle();break;else if(type.equals(requesttype.changeinformation)changeinformati
10、onhandle();else if(type.equals(requesttype.modifypasswd)modifypasswdhandle(req);else if(type.equals(requesttype.sendmessage)sendmessagehandle(req);else if(type.equals(requesttype.receivefile)receivefilehandle(req);else if(type.equals(requesttype.sendfile)sendfilehandle(req);private void modifypasswd
11、handle(request req) long id=long.parselong(req.getdata(id);string oldpwd=req.getdata(oldpwd);string newpwd=req.getdata(newpwd);response res=new response(requesttype.modifypasswd);try dao.updatepwd(id, oldpwd, newpwd);res.setdata(1);try oos.writeobject(res); catch (ioexception e) e.printstacktrace();
12、 catch (runtimeexception e) try oos.writeobject(res); catch (ioexception e1) e1.printstacktrace();private void changeinformationhandle() try user user=(user)ois.readobject();response res=new response(requesttype.changeinformation);try dao.updateuser(user);res.setdata(1);/修改成功返回值带一个整形值oos.writeobject
13、(res);oos.flush(); catch (runtimeexception e) oos.writeobject(res);/失败则返回值不带参数oos.flush();e.printstacktrace(); catch (ioexception e) e.printstacktrace(); catch (classnotfoundexception e) e.printstacktrace();private void exithandle() try s.close(); catch (ioexception e) e.printstacktrace();/发送文件priva
14、te void sendfilehandle(request req) /try /user u=(user)ois.readobject();/ catch (exception e) /e.printstacktrace();/ /接受文件private void receivefilehandle(request req) /发送消息private void sendmessagehandle(request req) response res=new response(requesttype.receivemessage);message message=null;try messag
15、e=(message)ois.readobject();res.setdata(message); catch (ioexception e) e.printstacktrace(); catch (classnotfoundexception e) e.printstacktrace();user to=message.getto();if(to=null)sendtoalluser(res);/如果收信人为null,则发送信息给所有人else/发送信息给to和他自己response res1=new response(requesttype.individualtalk);res1.set
16、data(message);objectoutputstream o=null;setset=servermainclass.usermap.keyset();iterator it=set.iterator();while(it.hasnext()user u=(user)it.next();if(u.equals(to)o=servermainclass.usermap.get(u).getoos();break;try o.writeobject(res1);o.flush(); catch (ioexception e) e.printstacktrace();/下线private v
17、oid offlinehandle() try servermainclass.usermap.remove(user);response res=new response(requesttype.offline);res.setdata(user);/把下线用户发送给所有客户端sendtoalluser(res);s.close(); catch (ioexception e) e.printstacktrace();private void registerhandle() user user=dao.adduser();try oos.writeobject(user);system.o
18、ut.println(user.getid()+:+user.getname();oos.flush(); catch (ioexception e) e.printstacktrace();/登录private void loginhandle(request req) long id=long.parselong(string)req.getdata(id);string pwd=(string)req.getdata(pwd);user=dao.getuser(id,pwd);response res;try setusers=servermainclass.usermap.keyset
19、();iterator iter=users.iterator();while(iter.hasnext()user u=(user)iter.next();if(u.equals(user)res=new response(requesttype.haveonline);oos.writeobject(res);oos.flush();return;/该用户已经在线res=new response(requesttype.online);res.setdata(user);oos.writeobject(res);oos.flush();/给刚上线用户发送在线用户列表if(user!=nul
20、l)setset=servermainclass.usermap.keyset();oos.write(set.size();iterator it=set.iterator();while(it.hasnext()oos.writeobject(it.next();oos.flush();sendtoalluser(res);/通知在线用户有新用户上线servermainclass.usermap.put(user, onlineuser);/保存用户信息 catch (ioexception e) e.printstacktrace();private void sendtoalluser
21、(response res)try collection c= servermainclass.usermap.values();iterator it=c.iterator();while(it.hasnext()objectoutputstream o=(onlineuser)it.next().getoos();o.writeobject(res);o.flush(); catch (ioexception e) e.printstacktrace();(2)客户程序模块客户通过socket(inetaddress,port)建立与服务器的连接。服务器与客户都通过构造objectinpu
22、tstream,objectoutputstream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的socket对象。客户端然后向服务器发送消息,比如文件传输等,服务器收到来自客户的请求后,针对不同的消息处理请求。具体的源码如下:package qq.client;import java.awt.color;import java.io.eofexception;import java.io.objectinputstream;import java.io.objectoutputstream;import javax
23、.swing.joptionpane;import javax.swing.jtextpane;import javax.swing.text.badlocationexception;import javax.swing.text.simpleattributeset;import javax.swing.text.styleconstants;import .*;import java.util.calendar;import qq.client.panel.userlistpanel;import qq.client.windows.individualtalkwindow;import
24、 qq.entity.*;public class clientthread extends threadprivate objectinputstream ois;private objectoutputstream oos;private socket s;private jtextpane receive;private jtextpane record;private jtextpane publicinfo;private userlistpanel userlist;private simpleattributeset set;public clientthread(jtextpa
25、ne receive, jtextpane record, jtextpane publicinfo, userlistpanel userlist) this.receive = receive;this.record = record;this.publicinfo = publicinfo;this.userlist = userlist;s=clientmainclass.socket;ois=clientmainclass.ois;oos=clientmainclass.oos;set=new simpleattributeset();styleconstants.setfontsi
26、ze(set, 16);styleconstants.setfontfamily(set,宋体);styleconstants.setforeground(set, new color(0,139,139);overridepublic void run() while(s.isconnected()try response res=(response)ois.readobject();if(res!=null)requesttype type=res.gettype();if(type.equals(requesttype.online)onlinehandle(res);else if(t
27、ype.equals(requesttype.offline)offlinehandle(res);else if(type.equals(requesttype.changeinformation)changeinformationhandle(res);else if(type.equals(requesttype.modifypasswd)modifypasswdhandle(res);else if(type.equals(requesttype.receivemessage)receivemessagehandle(res);else if(type.equals(requestty
28、pe.individualtalk)individualtalkhandle(res);else if(type.equals(requesttype.receivefile)receivefilehandle(res);else if(type.equals(requesttype.publicinfo)publicinfohandle(res); catch (eofexception e) e.printstacktrace(); catch (exception e) e.printstacktrace();private void modifypasswdhandle(respons
29、e res) if(res.getdata()!=null)joptionpane.showmessagedialog(null, 密码修改成功);elsejoptionpane.showmessagedialog(null, 密码修改失败n服务器忙,请稍后再试!);private void changeinformationhandle(response res) if(res.getdata()!=null)joptionpane.showmessagedialog(null, 修改成功);elsejoptionpane.showmessagedialog(null, 服务器忙,请稍后再试
30、!);private void publicinfohandle(response res) string str=(string)res.getdata();publicinfo.settext(str);private void receivefilehandle(response res) private void individualtalkhandle(response res) message message=(message)res.getdata();user user=message.getfrom();if(!clientmainclass.individual.conta
31、inskey(user.getid()int flag=joptionpane.showconfirmdialog(null,user.getname()+请求与你私聊,是否接受?,joptionpane.yes_no_option);if(flag=joptionpane.no_option)return;individualtalkwindow indi=new individualtalkwindow(user);clientmainclass.individual.put(user.getid(), indi.getreceivedmessagearea().gettextpane()
32、;indi.showme();jtextpane jtp=clientmainclass.individual.get(user.getid();try /输出信息发送人,时间jtp.getdocument().insertstring(jtp.getdocument().getlength(),user.getname()+ +message.gettime()+n,set); catch (badlocationexception e) e.printstacktrace();/输出信息message.analysismessage(jtp);private void receivemes
33、sagehandle(response res) message message=(message)res.getdata();if(clientmainclass.shield.contains(message.getfrom().getid()return;try /输出信息发送人,时间receive.getdocument().insertstring(receive.getdocument().getlength(),message.getfrom().getname()+message.gettime()+n,set); catch (badlocationexception e)
34、e.printstacktrace();/输出信息message.analysismessage(receive);private void offlinehandle(response res) user user=(user)res.getdata();clientmainclass.onlineusers.remove(user);userlist.freash(clientmainclass.onlineusers);calendar c = calendar.getinstance();string time=c.get(calendar.year)+-+c.get(calendar
35、.month)+-+c.get(calendar.day_of_month)+ +(c.get(calendar.hour_of_day)+8)+:+c.get(calendar.minute)+:+c.get(calendar.second);try receive.getdocument().insertstring(receive.getdocument().getlength(),user.getname()+ +time+ 下线n,set); catch (badlocationexception e) e.printstacktrace();private void onlineh
36、andle(response res) user user=(user)res.getdata();clientmainclass.onlineusers.add(user);userlist.freash(clientmainclass.onlineusers);calendar c = calendar.getinstance();string time=c.get(calendar.year)+-+c.get(calendar.month)+-+c.get(calendar.day_of_month)+ +(c.get(calendar.hour_of_day)+8)+:+c.get(c
37、alendar.minute)+:+c.get(calendar.second);try receive.getdocument().insertstring(receive.getdocument().getlength(),user.getname()+ +time+ 上线n,set); catch (badlocationexception e) e.printstacktrace();四调试分析:本次课设的编译环境,及编写平台为java。主要用到的类为包中的socket类和javax.swing包中的类。服务器线程在程序运行期间一直有效,接受客户端请求信息,转发客户端聊天内容,查看用户
38、信息。客户端运行时必须先登陆,登陆界面如图1,聊天程序主界面如图2,可以和所有在线用户群聊,也可以和某个用户私聊如图3。并且可以查看用户信息和修改自己的信息。本系统实现了选择图像,发送表情,自动刷新在线用户等功能。 最终效果:1.服务端启动:2.客户端启动:3.聊天通信:六 课程设计心得这个程序代码并不多,也不复杂,但程序编写中用到了java中的swing组件,面板容器,事件处理,线程的创建、同步,输入输出处理,内部类,异常处理,和网络通信的知识,所以我还是很有收获的。在这次的课程设计中,我也用到了socket 类和serversocket类,明白了它们是java实现socket通信的主要工具
39、。创建 serversocket对象就创建了一个监听服务,创建一个socket对象就建立了一个client与srever间的连接。明白了java语言网络编程的可靠性,平台无关性。总之通过本次实验,掌握了使用java语言进行面向对象设计的基本方法,提高运用面向对象知识解决实际问题的能力。提高面向对象程序设计的能力。我初学java,希望老师能对我的这个作品给与批评和耐心的指点。七参考文献: merlin hughes michael shoffnerjava网络编程实例清华大学出版社耿祥义 张跃平 java 2 实用教程清华大学出版社 张 辉 潭浩强 java 程序设计 清华大学出版社 莆羃肂莃葿
40、螆羈莂薁羁袄莁蚃螄芃莀蒃薇腿莀薅袃肅荿蚈蚅羁莈莇袁袇莇蒀蚄膅蒆薂衿肁蒅蚄蚂羇蒄莄袇羃蒄薆蚀节蒃蚈羆膈蒂螁蝿肄蒁蒀羄羀肇薃螇袆膇蚅羂膅膆莅螅肁膅蒇羁肇膄虿袃羃膃螂蚆芁膂蒁袂膇膂薄蚄肃膁蚆袀罿芀莆蚃袅艿蒈袈膄芈薀蚁膀芇螂羇肆芆蒂蝿羂芆薄羅袈芅蚇螈膆芄莆羃肂莃葿螆羈莂薁羁袄莁蚃螄芃莀蒃薇腿莀薅袃肅荿蚈蚅羁莈莇袁袇莇蒀蚄膅蒆薂衿肁蒅蚄蚂羇蒄莄袇羃蒄薆蚀节蒃蚈羆膈蒂螁蝿肄蒁蒀羄羀肇薃螇袆膇蚅羂膅膆莅螅肁膅蒇羁肇膄虿袃羃膃螂蚆芁膂蒁袂膇膂薄蚄肃膁蚆袀罿芀莆蚃袅艿蒈袈膄芈薀蚁膀芇螂羇肆芆蒂蝿羂芆薄羅袈芅蚇螈膆芄莆羃肂莃葿螆羈莂薁羁袄莁蚃螄芃莀蒃薇腿莀薅袃肅荿蚈蚅羁莈莇袁袇莇蒀蚄膅蒆薂衿肁蒅蚄蚂羇蒄莄袇羃蒄薆
41、蚀节蒃蚈羆膈蒂螁蝿肄蒁蒀羄羀肇薃螇袆膇蚅羂膅膆莅螅肁膅蒇羁肇膄虿袃羃膃螂蚆芁膂蒁袂膇膂薄蚄肃膁蚆袀罿芀莆蚃袅艿蒈袈膄芈薀蚁膀芇螂羇肆芆蒂蝿羂芆薄羅袈芅蚇螈膆芄莆羃肂莃葿螆羈莂薁羁袄莁蚃螄芃莀蒃薇腿莀薅袃肅荿蚈蚅羁莈莇袁袇莇蒀蚄膅蒆薂衿肁蒅蚄蚂羇蒄莄袇羃蒄薆蚀节蒃蚈羆膈蒂螁蝿肄蒁蒀羄羀肇薃螇袆膇蚅羂膅膆莅螅肁膅蒇羁肇膄虿袃羃膃螂蚆芁膂蒁袂膇膂薄蚄肃膁蚆袀罿芀莆蚃袅艿蒈袈膄芈薀蚁膀芇螂羇肆芆蒂蝿羂芆薄羅袈芅蚇螈膆芄莆羃肂莃葿螆羈莂薁羁袄莁蚃螄芃莀蒃薇腿莀薅袃肅荿蚈蚅羁莈莇袁袇莇蒀蚄膅蒆薂衿肁蒅蚄蚂羇蒄莄袇羃蒄薆蚀节蒃蚈羆膈蒂螁蝿肄蒁蒀羄羀肇薃螇袆膇蚅羂膅膆莅螅肁膅蒇羁肇膄虿袃羃膃螂蚆芁膂蒁袂膇膂薄蚄肃膁蚆袀罿芀莆蚃袅艿蒈袈膄芈薀蚁膀芇螂羇肆芆蒂蝿羂芆薄羅袈芅蚇螈膆芄
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络游戏服务条款
- 网络游戏安全防护措施指南
- 进制转换课程设计代码
- 智能物流仓储管理系统设计与实施合同
- 智能交通管理系统建设与运营服务合同
- 建筑业智慧工地与项目管理解决方案
- 2024地区代理权授权协议样本
- 在线教育课程设计与开发服务合同
- 2024年房产销售代表劳动协议
- 医疗器械技术研发及应用合同
- 校企共建项目合同违约条款
- GB/T 16716.5-2024包装与环境第5部分:能量回收
- 中小学教师如何做课题研究设计课件
- 《1.6.1 余弦定理》说课稿
- 2024年消防月全员消防安全知识专题培训-附20起典型火灾案例
- 恒牙临床解剖-上颌中切牙(牙体解剖学课件)
- 戏剧鉴赏学习通超星期末考试答案章节答案2024年
- 2024年国家公务员考试行测真题及解析(完整版)
- 《县委书记的榜样-焦裕禄》课件
- 公司工会活动积分制考核表
- 10以内口算100道题共16套-直接打印版
评论
0/150
提交评论