java网络聊天室课程设计报告(内附代码)_第1页
java网络聊天室课程设计报告(内附代码)_第2页
java网络聊天室课程设计报告(内附代码)_第3页
java网络聊天室课程设计报告(内附代码)_第4页
java网络聊天室课程设计报告(内附代码)_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计网络聊天室院(系) 别信电学院班学姓级号名计算 102指导教师时间2013-4-182013-5-10课 程 设 计 任 务 书题目网络聊天室课程设计系 (部)信电学院专班业级计算机科学与技术计算 102学生姓名学号4 月18 日至5月10日共4周指导教师 (签字)系 主 任(签字)年月日一、 设计内容及要求二、设计原始资料1) 电子工业出版社 jsp 实用教程,郑阿奇编著2) 电子工业出版社 java 程序设计实用教程,叶核亚编著 三、设计完成后提交的文件和图表1计算说明书部分jsp 界面设计2图纸部分:程序流程图四、进程安排五、主要参考资料1) 电子工业出版社 jsp 实用教程,郑

2、阿奇编著2) 电子工业出版社 java 程序设计实用教程,叶核亚编著考资料成 绩 评 定 表作品成绩报告成绩口试(答辩)总评成绩成绩目 录课程设计概述 .31.1 问题描述.31.2 功能需求分析.31.3 环境需求分析.3学生信息管理系统软件总体设计 .42.1 整体思路.42.2 总体设计流程图.5学生信息管理软件详细设计 .63.1.界面设计.63.2 通信功能实现方法.8参考文献 .44摘要私達実践能力高、学知識運用行更 創造、学校特 2 週間手配、私達 visual c+課程設計実習行 .詳説明 visual c+6.0 環境下、 過程設計、各種個数統計。機能、 1 段文字入力、 文

3、字中各類数記録、英文数、数字数、 空欄数数含、明 示.以下、課程通説明設計、説明統計、 説明調整、総括方面開発、詳 製作過程説明、作用、各種実行操作.关键字:統計,vc+6.0, 课程设计概述1.1 问题描述随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如: 信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联 系,已经成为当今社会人们主流的联系方式。因此,两台计算机之间进行即时通讯、 发送文件等交流方式已经成为必然潮流。因此出现了等聊天工具,然而等聊 天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程 度上来说,是一种娱乐

4、工具,不能作为用于即时通讯、文件共享的专用工具。目前, 用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对 的 c/s 模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。为此, 我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台 计算机之间信息的交流。避免了服务器忙或与服务器无法连接时,浪费过多时间用于 和服务器建立连接。因此,这个软件是极具适应性和实用性的即时通讯软件。1.2 功能需求分析实现网络聊天的功能,采用 windows socket(或 java socket)编程,服务器与客户端 采用了 tcp/ip 连接方式,在设计聊

5、天方案时,可将所有信息发往服务器端,再由服务 器进行处理,服务器端是所有信息的中心。服务器端要保存用户信息,可利用数据库 来实现这一功能,需要建立用户信息数据库。在客户端可采用文件系统保存聊天纪录 和用户号码。可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信 息。可通过建立消息链表来保存用户接收的各种消息。1.3 环境需求分析运行环境:windows 9x、2000 、xp、windows 7必要环境:jdk 1.6 以上、eclipse 开发环境硬件环境:cpu 400mhz 以上,内存 512mb 以上学生信息管理系统软件总体设计2.1 整体思路该 c/s 模式的聊天系统,就是

6、服务器来提供服务端连接响应,客户端主动的发起 连接请求。当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客 户之间的通信。对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。 首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端 就会根据设置的服务器 ip 地址,向服务器发起建立连接请求。而服务器端是始终在监 听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一 个服务线程,用于处理它的各种请求。对于客户端的各种请求,实际上都是通过在客户发往服务器的各种字符流区分的, 具体的方法就是在消息的头部以及尾部添加特殊字符串

7、,从而实现服务器对消息请求 的识别。比如对于登陆信息,消息的头部就是“peoplo”,而对于私聊中的消息,头 部就是“sec”,其他的同理都添加了头部。当然,对于客户端来说,这些都是透明的, 用户的操作并没有受到任何影响。在服务器端,消息被检测分析后,变回根据具体的 目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发 该条消息。这里额外要说的是,该系统特别的对用户发来的消息进行了加密处理,即用户的 各种具体信息,不仅能够防止向第三方的泄漏,而且即使服务器端出现异常,信息也 不会泄漏。对于私聊的方式,该系统所采用的方法类似于 qq 的通信方式,由发起方主动连 接,当目的方

8、接收到连接请求后,会主动建立一个私聊窗口,从而 实现私聊。2.2 总体设计流程图client接收请求后创建 socket 连接开始通信inputstreaminputstreamoutputstreamoutputstream学生信息管理软件详细设计3.1.界面设计由于这里界面设计源代码比较简单,这里不再列出。 3.1.1 服务器界面设计服务器界面3.1.2 客户端界面设计登陆界面注册界面聊天室界面3.2 通信功能实现方法列举部分实现通信功能的主要代码 appserver.java 文件public class appserver extends thread private serverso

9、cket serversocket;private serverframe sframe;private static vector useronline = new vector(1, 1);private static vector v = new vector(1, 1);/* 创建服务器 启动服务监听1001端口*/public appserver() sframe = new serverframe();try serversocket = new serversocket(1001);/ 获取服务器的主机名和ip地址inetaddress address = inetaddress

10、.getlocalhost();sframe.txtservername.settext(address.gethostname();sframe.txtip.settext(address.gethostaddress(); sframe.txtport.settext(1001); catch (ioexception e) fail(e, 不能启动服务!);sframe.txtstatus.settext(已启动.);this.start(); / 启动线程/* 退出服务器 * param e* param str*/异常退出信息public static void fail(excep

11、tion e, string str) system.out.println(str + 。 + e);/* 监听客户的请求,当有用户请求时创建 connection线程 */public void run() try while (true) / 监听并接受客户的请求socket client = serversocket.accept();new connection(sframe, client, useronline, v); / 支持多线程/ system.out.println(userlength:+userlength); catch (ioexception e) syste

12、m.out.println(不能监听);/* 启动服务器*/public static void main(string args) new appserver();serverframe.java文件public class serverframe extends jframe implements actionlistener public/*/jlist list;private static final long serialversionuid -8936397327038098620l;=/ 服务器信息面板jpanel pnlserver, pnlserverinfo;jlabel

13、 lblstatus, lblnumber, lblmax, lblservername, lblprotocol, lblip,lblport, lbllog;public jtextfield txtstatus, txtnumber, txtmax, txtservername, txtprotocol, txtip,txtport;jbutton btnstop, btnsavelog;public textarea talog;jtabbedpane tpserver;public textarea tamessage;/ 用户信息面板jpanel pnluser;public jl

14、abel lblmessage, lbluser, lblnotice, lblusercount;jlist lstuser;jscrollpane spuser;jtextfield txtnotice;jbutton btnsend, btnkick;public string ti = ;public string servermessage =;public serverframe() / 服务器窗口super(happychat聊天服务器);setsize(550, 500);setdefaultcloseoperation(jframe.exit_on_close);setres

15、izable(false);dimension scr =toolkit.getdefaulttoolkit().getscreensize();/ 在屏幕居中显示 dimension fra = this.getsize();if (fra.width scr.width) fra.width = scr.width;if (fra.height scr.height) fra.height = scr.height;this.setlocation(scr.width - fra.width) / 2,(scr.height - fra.height) / 2);/ =服务器信息面板= p

16、nlserver = new jpanel();pnlserver.setlayout(null);pnlserverinfo = new jpanel(new gridlayout(14, 1);pnlserverinfo.setborder(borderfactory.createcompoundborder(borderfactory.createtitledborder(), borderfactory .createemptyborder(1, 1, 1, 1);lblstatus = new jlabel(当前状态:);txtstatus = new jtextfield(10);

17、txtstatus.seteditable(false);lblnumber = new jlabel(当前在线人数:);txtnumber = new jtextfield(0 人, 10); txtnumber.seteditable(false);lblmax = new jlabel(最多在线人数:);txtmax = new jtextfield(50 人, 10); txtmax.seteditable(false);lblservername = new jlabel(服务器名称:);txtservername = new jtextfield(10);txtservername

18、.seteditable(false);lblprotocol = new jlabel(访问协议:);txtprotocol = new jtextfield(http, 10); txtprotocol.seteditable(false);lblip = new jlabel(服务器ip:);txtip = new jtextfield(10);txtip.seteditable(false);lblport = new jlabel(服务器端口:);txtport = new jtextfield(8000, 10); txtport.seteditable(false);btnsto

19、p = new jbutton(关闭服务器(c);btnstop.addactionlistener(new actionlistener() public void actionperformed(actionevent arg0) closeserver(););lbllog = new jlabel(服务器日志);talog = new textarea(20, 50);btnsavelog = new jbutton(保存日志(s);btnsavelog.addactionlistener(new actionlistener() public void actionperformed

20、(actionevent arg0) savelog(););pnlserverinfo.add(lblstatus);pnlserverinfo.add(txtstatus);pnlserverinfo.add(lblnumber);pnlserverinfo.add(txtnumber);pnlserverinfo.add(lblmax);pnlserverinfo.add(txtmax);pnlserverinfo.add(lblservername);pnlserverinfo.add(txtservername);pnlserverinfo.add(lblprotocol);pnls

21、erverinfo.add(txtprotocol);pnlserverinfo.add(lblip);pnlserverinfo.add(txtip);pnlserverinfo.add(lblport);pnlserverinfo.add(txtport);pnlserverinfo.setbounds(5, 5, 100, 400);lbllog.setbounds(110, 5, 100, 30);talog.setbounds(110, 35, 400, 370);btnstop.setbounds(200, 410, 120, 30);btnsavelog.setbounds(32

22、0, 410, 120, 30); pnlserver.add(pnlserverinfo);pnlserver.add(lbllog);pnlserver.add(talog);pnlserver.add(btnstop);pnlserver.add(btnsavelog);/ =在线用户面板= pnluser = new jpanel();pnluser.setlayout(null);lblmessage = new jlabel(用户消息);tamessage = new textarea(20, 20);lblnotice = new jlabel(通知:);txtnotice =

23、new jtextfield(20);btnsend = new jbutton(发送(s);btnsend.setenabled(true);btnsend.addactionlistener(new actionlistener() public void actionperformed(actionevent arg0) servermessage(););lblusercount = new jlabel(在线总人数 0 人);btnkick = new jbutton(踢人(k);btnkick.addactionlistener(new actionlistener() publi

24、c void actionperformed(actionevent arg0) tiren(););lbluser = new jlabel(在线用户列表);lstuser = new jlist();lstuser.setvisiblerowcount(17);lstuser.setfixedcellwidth(180);/指定的固定单元格宽度值,而不 是从列表元素计算而来的宽度值lstuser.setfixedcellheight(18);spuser = new jscrollpane();spuser.setverticalscrollbarpolicy(jscrollpane.ve

25、rtical_scrollbar_always);spuser.getviewport().setview(lstuser);lblmessage.setbounds(5, 5, 100, 25);tamessage.setbounds(5, 35, 300, 360);lbluser.setbounds(310, 5, 100, 25);spuser.setbounds(310, 35, 220, 360);lblnotice.setbounds(5, 410, 40, 25);txtnotice.setbounds(50, 410, 160, 25);btnsend.setbounds(2

26、10, 410, 80, 25);lblusercount.setbounds(320, 410, 100, 25); btnkick.setbounds(440, 410, 80, 25);pnluser.add(lblmessage);pnluser.add(tamessage);pnluser.add(lbluser);pnluser.add(spuser);list = new jlist();list.setlistdata(new string );spuser.setviewportview(list);pnluser.add(lblnotice);pnluser.add(txt

27、notice);pnluser.add(btnsend);pnluser.add(lblusercount);pnluser.add(btnkick);/ =主标签面板=tpserver = new jtabbedpane(jtabbedpane.top );tpserver.add(服务器管理, pnlserver); tpserver.add(用户信息管理, pnluser);this.getcontentpane().add(tpserver);setvisible(true);protected void servermessage() / todo 自动生成方法存根this.serv

28、ermessage = txtnotice.gettext(); txtnotice.settext();protected void closeserver() / todo 自动生成方法存根this.dispose();/this.resprotected void savelog() / todo 自动生成方法存根try fileoutputstream fileoutput = newfileoutputstream(log.txt,true);string temp = tamessage.gettext();fileoutput.write(temp.getbytes();file

29、output.close();joptionpane.showmessagedialog(null, 记录保存在log.txt); catch (exception e) system.out.println(e);protected void tiren() / todo 自动生成方法存根ti = list.getselectedvalue().tostring();log(ti:+ti);private void log(string string) / todo 自动生成方法存根string newta = tamessage.gettext(); newta += (n+string)

30、;tamessage.settext(newta);public void actionperformed(actionevent evt) public static void main(string args) new serverframe();connection.java文件public class connection extends thread /* 与客户端通讯socket*/private socket netclient;/* 在线用户列表*/private vector useronline;/* 聊天信息*/private vector userchat;/* 从客户

31、到服务器 输入流*/private objectinputstream fromclient;/* 传到客户端 打印流*/private printstream toclient;/* 注册用户列表*/private static vector vlist = new vector();/* 临时对象*/private object obj;/* 服务器日志窗体*/private serverframe sframe;suppresswarnings(unchecked)/* 创建与客户端通讯*/public connection(serverframe frame, socket clien

32、t, vector u, vector c) netclient = client;useronline = u;userchat = c;sframe = frame;try / 发生双向通信/ 检索客户输入fromclient = newobjectinputstream(netclient.getinputstream();/ 服务器写到客户toclient = new printstream(netclient.getoutputstream(); catch (ioexception e) try netclient.close(); catch (ioexception e1) s

33、ystem.out .println(不能建立流 + e1);return;this.start();/* 处理与客户端的通讯线程*/public void run() try / obj是object类的对象obj = (object) fromclient.readobject();if (obj.getclass().getname().equals(customer) serverlogin();serverlogindb();if (obj.getclass().getname().equals(register_customer)/serverregiste();serverreg

34、istedb();if (obj.getclass().getname().equals(message) servermessage();if (obj.getclass().getname().equals(chat) serverchat();if (obj.getclass().getname().equals(exit) serverexit(); catch (ioexception e) system.out.println(e); catch (classnotfoundexception e1) system.out.println(读对象发生错误! + e1); final

35、ly try netclient.close(); catch (ioexception e) system.out.println(e);/* 登录处理*/suppresswarnings(deprecation)public void serverlogin() try customer clientmessage2 = (customer) obj;/ 读文件fileinputstream file3 = new fileinputstream(user.txt);objectinputstream objinput1 = newobjectinputstream(file3);vlis

36、t = (vector) objinput1.readobject();int find = 0; / 查找判断标志/ system.out.println(find);for (int i = 0; i vlist.size(); i+) register_customer reg = (register_customer)vlist.elementat(i);if (reg.custname.equals(clientmessage2.custname) find = 1;if(!reg.custpassword.equals(clientmessage2.custpassword) to

37、client.println(密码不正确);break; else / 判断是否已经登录int login_flag = 0;for (int a = 0; a = 50) toclient.println(登录人数过多,请稍候再试);break;if (login_flag = 0) clientmessage2.custhead = reg.head;/getuserheadbyname(clientmessage2.custname);useronline.addelement(clientmessage2);toclient.println(登录成功); date t = new da

38、te();log(用户 + clientmessage2.custname + 登录成功,+ 登录时间: + t.tolocalestring() +n);freshserveruserlist();break; else toclient.println(该用户已登录); else continue;if (find = 0) toclient.println(没有这个用户,请先注册); file3.close();objinput1.close();fromclient.close(); catch (classnotfoundexception e) system.out.println

39、(e); catch (ioexception e) system.out.println(e);/* 登录处理* throws exception*/suppresswarnings(deprecation)public void serverlogindb() try customer clientmessage2 = (customer) obj;string name = clientmessage2.custname;string pass = clientmessage2.custpassword;string sql = select * from yonghu where cu

40、stname= + name+ ;r esultset rs = db.executequery(sql);s ystem.out.println(sql: + sql);boolean login = false;string head=;while (rs.next() string ps=rs.getstring(custpassword).tostring(); system.out.println(ps:+ps+);system.out.println(pass:+pass+);if (ps.equals(pass.tostring() login = true;system.out

41、.println(logined:);system.out.println(compareto:+pareto(pass); head=rs.getstring(head);system.out.println(head:+rs.getstring(head); system.out.println(login:+login);if (!login) toclient.println(密码不正确); return;/ 判断是否已经登录int login_flag = 0;for (int a = 0; a = 50) toclient.println(登录人数过多,请稍候再试); return

42、;if (login_flag = 0) system.out .println(head:+head);clientmessage2.custhead =head;/getuserheadbyname(clientmessage2.custname);useronline.addelement(clientmessage2);toclient.println(登录成功); date t = new date();log(用户 + clientmessage2.custname + 登录成功, + 登录时间:+ t.tolocalestring() + n); freshserveruserl

43、ist();return; else toclient.println(该用户已登录);fromclient.close(); catch (exception e) e.printstacktrace();/* 刷新服务器日志窗体在线列表*/private void freshserveruserlist() string userlist = new string50; customer cus = null;for (int j = 0; j useronline.size(); j+) cus = (customer) useronline.get(j); userlistj = cus

温馨提示

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

最新文档

评论

0/150

提交评论