已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设计报告 设计选题 网络聊天室姓 名 马继鸣 学 号 0909090630 完成时间 2012-1-12一、需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。通过java提供的socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而java提供的多线程功能。用多线程可完成多点对多点的聊天。主要有两个应用程序,分别为服务器程序和客户端程序。服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。采用client/server(c/s)体系结构,即客户机/服务器体系结构。聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。该聊天系统实现群聊,用户登陆,退出聊天系统等功能。二. 设计1设计思想: 课程设计中利用java实现基于c/s模式的聊天程序。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。2功能设计 (1)服务器端的主要功能如下。 在特定端口上进行侦听,等待客户端连接。用户可以配置服务端的侦听端口,默认端口为10000.当停止服务时,断开所有用户连接。 (2)客户端的主要功能如下。 连接到已经开启聊天服务的服务端。 当服务器端开启的话,用户可以随时登录与注销。 用户可以向所有人发送消息。3详细设计聊天室服务器端设计聊天室服务器中主要的功能文件的功能如下:mybutlis.java主要用于添加事件侦听和动作处理,具体是服务器按钮中的“终止”“发送”的处理。public class mybutlis implements actionlistener private myserve server; private jtextfield filed1; public void actionperformed(actionevent e) mychatset.java服务器的线程队列,运行的方法,新增一个用户,则增加一个线程,并可以返回应答消息,给其余用户发送上下线信息,发送聊天信息(群聊私聊虽然已写,但是不知为何没有实现),发送用户列表。关键在于除了线程之外,还定义了传输数据时的协议内容,如何分辨不同的信息,如聊天信息,登陆信息,上下线信息,并把信息完整准确的传递。 public static arraylist servers=new arraylist();/线程队列public static void addthread(myserthread th) /增加一个服务器线程对象public static void sendremess(string type,string state,string s,myserthread myth)/返回应答信息 public static void sendosmess(string type,string user)/其他用户上下线信息public static void sendchatmess(string type,string sender,string reciver,string mess)/聊天信息 public static void sendlist/用户列表 mychecktool.java保存用户的登陆信息,在其中建立一个码表,并且可以判断登陆信息是否合法。/建立码表,用以保存用户信息private static map maps=new hashmap(); public static boolean checkuser(myuserinfo user)/ 验证用户名myframe.java建立服务器的主界面,关联侦听器。并启动线程。myframe my=new myframe();my.showui();/ 显示ui界面public void showui()server.setup();myserthread.java服务器线程类,定义输入输出流,发送读取信息,获取信息中相应标签的信息,用以判断用户名,密码,并可以中断连接。this.socket=socket;output=socket.getoutputstream();input=socket.getinputstream();public void sendmess(string s)/发送信息public string readmess() /读取信息public boolean readfirst()/将第一条信息读出来public string getvalue(string type ,string mess) public void pocess()/用以判断用户名、密码public void run()/线程开始 public myuserinfo getuser()/获得该线程中的用户信息myserve.java建立服务器,并启动该线程。server=new serversocket(inport);socket sc=server.accept();/获得socket对象myserthread th=new myserthread(sc);th.start();/启动线程客户端中主要的功能文件概述如下:mybutlis.java主要用于添加事件侦听和动作处理,具体是在客户端中的登陆注册发送等的处理。public mybutlis(mysocketchat socket,jtextarea area1,jtextarea area2,myloginui loginui,jcombobox box)public void actionperformed(actionevent e) /设置动作监听器 mychatframe.java客户端的图形界面。关联侦听器。并启动线程。socket.setarea(area1);socket.start()myloginui.java 登陆界面mysocketchat.java构建连接,截取字符串,发送登陆,注册,聊天信息,读取信息并判断设置启动线程方法。 public mysocketchat(jtextfield field1,jtextfield field2,jtextarea area)/重写构造函数public string getvalue(string type ,string mess) /截取字符串public void sendmess(string type)/ 发送登陆或者注册信息public void sendchat(string getter,string chat)/ 发送聊天消息public string readmess ()/读入的信息public void checkmess(string mess) /判断是什么消息public void run()/设置启动方法三. 调试及测试1、调试过程中遇到的主要问题及解决方法 在对于群聊和私聊的处理中,只实现了群聊,私聊虽有写,但是还没有实现,由于时间仓促,只能在寒假的其余时间努力完成。还有就是如何在服务器与客户端的信息交互过程中,让他们能分辨是哪种信息并准确的读出来。如果不能准确的分析,则数据的交换只能完成一种粗略的互换,而不能提取聊天内容等用户希望得到的信息。为此,我专门看了很多相关的资料,在很多方法里面选取了一种自己容易理解的方法,我就定义了几种方式,分别辨认登陆注册聊天列表等信息:+type+user+pwd+;/第一个与最后一个msg是标示一整句话的标示符 type标示数据类型,两个中间的type即为需求数据,两个之间的是用户名称,两个之间的pwd指的是密码chat+user+getter+chat+;/其中sender,reciever,content分别指发送者、接受者、内容。一些语法问题,在随着写程序的过程中,也慢慢纠正。在服务器组建中,由于java对于网络连接强有力的支持和丰富的代码,让我没有遇到太难的问题。2、对设计和编码的回顾讨论和分析 在获取系统时间这一块上,还是做得比较好。calendar ca=calendar.getinstance();date da=new date();/ 注意是在java.util.date simpledateformat format=new simpledateformat(hh:mm:ss);/设置时间格式da=ca.gettime();time=format.format(da); 处理保存的注册信息时,可能做得不是很好,将hashmap写入文件,这样不能长期保存注册信息,只能在服务器不关闭的状态下,保存注册信息。这个也会继续改进3、程序运行的时空效率分析本程序应用了线程对端口进行侦听。线程一直后台开启,长期占用系统资源,但又能及时的实现端口监听和消息的收发。4、测试数据集服务器端程序主界面:可以记录用户名,账号,ip地址,并可以发送系统消息客户登陆注册界面注册成功提示框客户端运行界面用户端测试界面中间的(全部)按钮, 点击后可以显示当前在线的好友列表,并选择聊天对象四、经验和体会。这是我第一次做java项目,只是这个学期选修了面向程序设计,每周一节课,很浅显的学习了java语言,在综合性如此强的项目设计中,感觉力不从心。刚开始的一天里遇到了各种困难,不管是从原理上还是细节语法上,都感觉很难,索性前两天没有着手做, 只是在看别人的项目制作过程去学习思路,或者是在看java中的io stream,swing,awt,net的基础原理和内容,然后的才慢慢一步一步的开始做,因为慢,所以坚持写,一共五天的时间,有两天没有睡觉。还好有些设计基础,在最后终于可以完成一些基本的目标。通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问题,解决问题的能力,进一步加强了java的实际应用能力。在网络知识中,也许这个知识点是可以铭记终身的。在如此痛苦又快乐的第一次的后面,我想,要我继续写别的程序的话, 我可以更有信息一些,一些流程已经了然于胸。不管怎么样,只有自己动手做了,才能是自己牢牢掌握的知识。所以我也会坚持去做些动手的内容,去锻炼自己。关键段落的代码:服务器端myserve.javapackage com.javake.server;import java.io.ioexception;import .serversocket;import .socket;public class myserve private int inport; private serversocket server; /重写构造函数 public myserve(int inport) this.inport=inport; /建立服务器public void setup() try server=new serversocket(inport); while(true) /获得socket对象 socket sc=server.accept(); myserthread th=new myserthread(sc); /启动线程 th.start(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); public serversocket getserver() return server;myserthread.javapackage com.javake.server;import java.io.*;import .socket;public class myserthread extends thread private socket socket; private myuserinfo usein; /用户对象 private inputstream input; private outputstream output; public myserthread(socket socket) /建立构造函数 this.socket=socket; /传入管道 try output=socket.getoutputstream(); input=socket.getinputstream(); catch (ioexception e) / todo auto-generated catch block e.printstacktrace(); public void sendmess(string s) byte b=s.getbytes(); try output.write(b);output.flush(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); public string readmess() stringbuffer buff=new stringbuffer(); string s=; boolean end=false; int i=0; try /循环 while(!end) i = input.read(); char c=(char)i; buff.append(c); s=buff.tostring().trim(); if(s.endswith() s=new string(s.getbytes(iso-8859-1),gbk).trim(); break; catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); return s; /将第一条信息独立出来 public boolean readfirst() string mess=readmess(); string flag=getvalue(type, mess); /截取标记 if(flag.equals(reg) /判断是否为注册信息 string name=getvalue(name, mess); /获得注册的用户 string pwd=getvalue(pwd, mess); myuserinfo user=new myuserinfo(); user.setname(name); user.setpassword(pwd); if( mychecktool.setuser(user) /验证注册是否成功 this.usein=user; mychatset.sendremess(regresp, 1, 欢迎来到进入聊天室, this); return true; else mychatset.sendremess(regresp, 0,用户已存在,注册失败 , this); return false; if(flag.equals(login) /判断是否为登陆用户 string name=getvalue(name, mess); /获得注册的用户 string pwd=getvalue(pwd, mess); string ip=getvalue(ip, mess); myuserinfo user=new myuserinfo(); user.setname(name); user.setpassword(pwd); user.setipaddress(ip); if( mychecktool.checkuser(user) /验证登陆是否成功 this.usein=user; mychatset.sendremess(loginresp, 1, 欢迎来到进入聊天室, this); mychatset.sendosmess(online, this.usein.getname();/发送用户上线消息mychatset.addthread(this); /将线程加入队列mychatset.sendlist();/发送用户队列 return true; else mychatset.sendremess(loginresp, 0,用户名或账号错误 , this); return false; /否则返回登陆失败 public string getvalue(string type ,string mess) int i=mess.indexof()+type.length()+2; int j=mess.indexof(); string s= mess.substring(i,j); /获得截取的信息 return s; public void pocess()/用以判断用户名、密码 if(readfirst() /登陆或注册成功 string str=readmess();string tp=getvalue(type, str);while(tp!=offline) if(tp.equals(chat)/获得类型标签 string sender=getvalue(sender, str); /获得内容string getter=getvalue(reciver, str); string content=getvalue(content, str); mychatset.sendchatmess(chat, sender, getter, content); /发送消息 else if(tp.equals(offline) /判断是否为下线消息 string user=getvalue(user, str); mychatset.sendosmess(offline, user); else if(tp.equals(login) /注册后可能发来登陆消息 string name=getvalue(name, str); /获得注册的用户 string pwd=getvalue(pwd, str); string ip=getvalue(ip, str); myuserinfo user=new myuserinfo(); user.setname(name); user.setpassword(pwd); user.setipaddress(ip); if( mychecktool.checkuser(user) /验证登陆是否成功 this.usein=user; mychatset.sendremess(loginresp, 1, 欢迎来到进入聊天室, this); mychatset.addthread(this); system.out.println(二次注册或登录成功); mychatset.sendlist(); mychatset.sendosmess(online, this.usein.getname();/发送用户上线消息 else /将线程加入队列/发送用户队列 mychatset.sendremess(loginresp, 0,用户名或账号错误 , this); str=readmess(); tp=getvalue(type, str); try /关闭socketsocket.close(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); public void run()/线程开始 pocess(); /获得该线程中的用户信息 public myuserinfo getuser() return usein; mybutlis.javapackage com.javake.server;import java.awt.event.*;import java.io.ioexception;import javax.swing.jtextfield;public class mybutlis implements actionlistenerprivate myserve server;private jtextfield filed1;public mybutlis(myserve server,jtextfield filed1)this.server=server;this.filed1=filed1;overridepublic void actionperformed(actionevent e) string s=e.getactioncommand();system.out.println(服务器在运行);if(s.equals(终止) system.out.println(在进行中); try server.getserver().close(); catch (ioexception e1) / todo auto-generated catch blocke1.printstacktrace();else if(s.equals(发送)myuserinfo user=new myuserinfo();user.setname(服务器);string mess=filed1.gettext();mychatset.sendchatmess(chat, user.getname(), , mess); filed1.settext();mychatset.javapackage com.javake.server;import java.util.arraylist;import javax.swing.swingutilities;import com.javake.server.myframe;public class mychatset public static arraylist servers=new arraylist();/线程队列 public static void addthread(myserthread th) /增加一个服务器线程对象 servers.add(th); swingutilities.updatecomponenttreeui(myframe.table); system.out.println(有+servers.size()+在线上); public static void sendremess(string type,string state,string s,myserthread myth) myth.sendmess(+type+state+s+); public static void sendosmess(string type,string user) for(int i=0;iservers.size();i+) myserthread myth=servers.get(i); /获得线程类 myth.sendmess(+type+user+); public static void sendchatmess(string type,string sender,string reciver,string mess) if(reciver.equals()/如果获得的接受者为“”就是群发 for(int i=0;iservers.size();i+) myserthread myth=servers.get(i); /获得线程类 myth.sendmess(+type+sender+reciver+mess+); else /发送给某个对象 for(int i=0;iservers.size();i+) /获得线程类 myserthread myth=servers.get(i);if(myth.getuser().getname().equals(reciver) myth.sendmess(+type+sender+reciver+mess+); public static void sendlist() string list=budylist全部,; for(int i=0;iservers.size();i+) myserthread ser=servers.get(i); string name=ser.getuser().getname(); list=list+name+,; list=list+; for(int i=0;iservers.size();i+) myserthread ser=servers.get(i); ser.sendmess(list); /给每个在线用户发送列表 客户端:mysocketchat.javapackage com.javake.mysocket;import java.io.*;. private socket socket; private string ip=localhost; private inputstream input; private outputstream output; private jtextfield field1; private jtextfield field2; private string user; private jtextarea area; private boolean end=false; private mychatframe my; public mysocketchat(jtextfield field1,jtextfield field2,jtextarea area) this.field1=field1; this.field2=field2; this.area=area;/建立sockettry socket=new socket(ip,10000);input=socket.getinputstream();output=socket.getoutputstream(); catch (unknownhostexception e) e.printstacktrace(); catch (ioexception e) e.printstacktrace(); public string getvalue(string type ,string mess) /截取字符串 int i=mess.indexof()+type.length()+2; int j=mess.indexof(); string s= mess.substring(i,j); /获得截取的信息 return s; public void sendmess(string type) user=field1.gettext();/账号 string pwd=field2.gettext();/密码 string mess=; if(type.equals(reg) mess=+type+user+pwd+; else mess=+type+user+pwd+socket.getremotesocketaddress().tostring().trim()+; byte b=mess.getbytes();/获得字符 try output.write(b); /输出 output.flush(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); public void sendchat(string getter,string chat) stringstr=chat+user+getter+chat+; byte b=str.getbytes(); try output.write(b);output.flush(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); public string readmess () throws ioexception stringbuffer buff=new stringbuffer(); string s=; int i=0; boolean flag=false; while(!flag) /循环 i = input.read(); char c=(char)i; buff.append(c); s=buff.tostring().trim(); if(s.endswith() s=new string(s.getbytes(iso-8859-1),gbk).trim(); break; return s; public void checkmess(string mess) /判断是什么消息 string time;calendar ca=calenda
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/TS 20961:2024 EN Footwear - Performance requirements for components for footwear - Shanks
- 《焊接机器人综合实验》教学大纲
- 大班个案分析
- 教案:物理试卷
- 六年级下册品德书全教学课件教学
- 玉溪师范学院《西方音乐史与名作欣赏》2022-2023学年第一学期期末试卷
- 玉溪师范学院《实变函数》2022-2023学年第一学期期末试卷
- 收到以物抵债的设备账务处理实例-做账实操
- 项目临建工程施工方案
- 泰州市2016年新能源汽车推广应用实施方案
- (高清版)DZT 0282-2015 水文地质调查规范(1:50000)
- 空调维保项目进度保障计划
- 污水管网施工-施工现场总平面布置(纯方案-)
- 《工业管理与一般管理》
- T-CASA 0005-2022 超前预警电气火灾监控系统技术标准
- 2024年中国电信贵州公司社会人才招聘41名高频考题难、易错点模拟试题(共500题)附带答案详解
- 《网页设计与制作》课程标准(含课程思政)
- 网络工程专业职业发展报告
- 中心幼儿园精细化管理
- 葛洲坝毕业实习报告
- 《液压油液》课件
评论
0/150
提交评论