计算机网络课程设计报告书4542816318_第1页
计算机网络课程设计报告书4542816318_第2页
计算机网络课程设计报告书4542816318_第3页
计算机网络课程设计报告书4542816318_第4页
计算机网络课程设计报告书4542816318_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、 学 号: 武汉理工大学华夏学院课 程 设 计    题 目计算机网络课程设计系 别信息工程专 业软件技术班 级姓 名成 绩   2011年01月 13 日  课程设计任务书学生姓名: 专业班级: 题 目: 简单的聊天软件(c/s) 目录一、设计目的3二、设计任务3三、时间安排3四、具体设计过程和步骤(以协议验证编程为例)34.1 需求分析34.1.1项目描述34.1.2系统需求44.2套接字介绍与使用44.3 流程分析与设计44.4 项目基本步骤54.4.1创建项目以及基本的包54.4.2创建

2、项目的基本类54.5 编码64.6 系统实施与运行184.6.1服务器启动与关闭窗体视图184.6.2客户端产生视图184.6.3服务器聊天窗口、客户机聊天窗口184.6.4服务器与客户机交互194.6.4 cmd模式telnet服务器进行和交互20五、设计心得体会21六、设计过程中的疑问21七、指导教师评语22一、 设计目的通过本课程设计,培养学生具有c/s或b/s式的网络应用系统的设计和开发以及中小规模组网能力;掌握常用网络开发工具(如vb、vc)的使用,或掌握web开发工具(如asp等)的方法与网络规划、设计、集成的步骤和方法;使同学们经历网络应用系统开发及网络集成的全过程和受到一次综合

3、训练,以便能较全面地理解、掌握和综合运用所学的知识,在实践中培养分析问题和解决问题的能力。并为毕业设计打下坚实的基础。通过分析设计和实现,可以使理论知识得到验证并且能够了解基本网络开发的方法、步骤,细节,提高动手能力。二、 设计任务1. 实现简单的客户端发送信息、服务器端收信息。2. 实现简单的服务器端发送信息、客户端收信息3. 实现客户端请求关闭连接,服务器作出相应4. 编程模拟实现telnet5. 获取主机名和ip地址三、 时间安排01月10日,查阅资料,确定设计题目;01月11日,分析题目,创建工程,准备程序;01月12日,封装代码,上机调试程序;01月13日,提交课程设计报告;四、 具

4、体设计过程和步骤(以协议验证编程为例)4.1 需求分析4.1.1项目描述 在信息网络高速发展的今天,网上聊天已成为了我们每天生活、工作必不可少的一部分,如qq、飞鸽、uc等聊天工具的普及。聊天工具为我们的生活和学习带来了很多方便,在这里我做了一个简单的网络聊天软件神话聊天室,实现了一些基本的服务器与客户端的相互交流和请求,本项目编写简单,易于移植,交流方便。本项目主要实现的功能是利用网络知识套接字(ip地址+端口号),实现服务器和客户端的基本通信功能,并且服务器可以实现同时与多台客户端通信交流。本项目利用java知识、借助myeclipse开发平台,写了一个服务器端和一个客户端,可以将这个客户

5、端移植到别的机器上与本机实现多对一的交流,同时客户端也可以在自己利用远程登陆的方式(开始>运行>cmd>telnet 服务器ip 服务器端口号),与服务器进行交流。4.1.2系统需求1. 问题描述利用myeclipse平台,设计出简洁, 用户友好的聊天界面及方便灵活的客户端与服务器之间的交流,能完成基本的一对一用户交流、一对多用户交流,客户端与服务器之间的相互请求关闭连接的操作。该系统主要包括服务器端和客户端两部分:服务器端:利用java知识serversocket类定义一个服务器端端口new serversocket(int iport),然后不但让服务器端端口产生监听,利

6、用多线程知识定义一个线程类,让每接受到一个监听就给服务器产生一个聊天窗口,直至聊天结束就关闭此窗口。客户端:利用 java 知识socket类定义一个客户端 端口new socket( string ip,int iport),此ip为服务器端主机的ip地址,端口号为服务器端服务器定义的端口号,然后让客户端启动,这样客户端就会就请一次服务器,服务器接受到一个监听就给服务器产生一个与之对应的聊天窗口,两者进行聊天,直至哪一方要求结束聊天就关闭窗体。2. 显示服务器与客户机的ip和主机名利用java中的getlocaladdress().gethostname()和getinetaddress()

7、;3. 项目视图的建立 利用java se 知识采用java中swing包控件,创建一个启动服务器的窗体(见图4)、一个启动客户端的窗体(见图6)、一个服务器端的聊天窗体(见图8)、一个客户端的聊天窗体(见图8)。4.2套接字介绍与使用 多个tcp连接或多个应用程序进程可能需要通过同一个 tcp协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与tcpip协议交互提供了称为套接字(socket)的接口。多个tcp连接或多个应用程序进程可能需要通过同一个 tcp协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与tcpip协议交互提供了

8、称为套接字(socket)的接口。套接字简介:套接字,是支持tcp/ip的网络通信的基本操作单元,可以看做是不同主机的间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程4.3 流程分析与设计启动服务器serversocket ss产生服务器端聊天窗口产生监听socket s=ss.accept()启动客户端输入服务器端主机ip+porttruefalsetruefalse产生客户端聊天窗口进行相互交流图1 主要流程图4.4 项目基本步骤4.4.1创建项目以及基本的包打开myeclipse,新建java project工程,取名为chatroom,

9、图2; 在src下新建包edu.huaxia.chatserver、edu.huaxia.chatclient,图3; 图2 图3 4.4.2创建项目的基本类1. 创建启动服务器视图类tcpserveview.java,代码见4.5编码12. 创建线程服务器类tcpsession.java,代码见4.5编码23. 创建服务器端聊天窗口视图类chatwindowserevrview.java,代码见4.5编码34. 创建启动客户端视图类clientview.java,代码见4.5编码45. 创建客户端聊天窗口视图类tcpclient.java,代码见4.5编码54.5 编码1. tcpserve

10、view.java代码:package edu.huaxia.chatserver;import java.aw*;import java.io.ioexception;import .serversocket;import .socket;import javax.swing.*;/* * author thomas *服务器端窗体:开始和停止服务 */public class tcpserverview extends jframeprivate static final long serialversionuid = 1l;private serversocket ss;private

11、jbutton start,stop;public tcpserverview()super("服务器窗体");try ss = new serversocket(6666);/给服务器绑定一个端口 catch (ioexception e1) e1.printstacktrace();start = new jbutton("启动服务器");/开始按钮监听事件>启动服务器start.addactionlistener(new actionlistener()public void actionperformed(actionevent e) st

12、art.setvisible(false);/启动后设置开始按钮不可见/如果停止按钮是不可见时,启动后设置停止按钮可见if (stop.isvisible()=false) stop.setvisible(true);this.start();/调用内部类的start方法/* * 内部类方法,监听一个端口,并产生一个线程 */private void start() try socket socket=ss.accept();new tcpsession(socket).start();/让线程开启 this.start(); catch (ioexception e) / todo auto

13、-generated catch blocke.printstacktrace(););stop = new jbutton("关闭服务器");stop.setvisible(false);/最初时设置停止按钮不见/停止按钮监听事件>停止服务器stop.addactionlistener(new actionlistener()public void actionperformed(actionevent e) this.close();/调用内部类的close方法/如果开始按钮是不可见时,启动后设置开始按钮可见if (start.isvisible()=false)

14、 start.setvisible(true);/设置停止按钮不可见stop.setvisible(false);/* * 内部类方法,关闭端口 */private void close() try if(ss!=null)/如果端口不为空,就关闭该端口ss.close(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(););this.add(start);this.add(stop);this.setlayout(null);this.setbackground(color.light_g

15、ray);this.setbounds(150, 150, 300, 300);this.setvisible(true);start.setbounds(100, 75, 100, 50);stop.setbounds(100, 155, 100, 50);public static void main(string args) /主方法,调用自己,产生图形化用户界面new tcpserverview();2. tcpsession.java代码:package edu.huaxia.chatserver;import java.io.*;import .socket;import edu.

16、huaxia.chatview.chatwindowserverview;/* * author thomas *对服务器产生的线程进行处理 */public class tcpsession extends thread private socket socket;private bufferedreader br;private printstream ps;public tcpsession(socket s) this.socket = s;try /定义端口的输入输出流br=new bufferedreader(new inputstreamreader(socket.getinpu

17、tstream();ps=new printstream(socket.getoutputstream(); catch (ioexception e) e.printstacktrace();/* * 流的关闭方法 */public void close()try if(br!=null) br.close();if(ps!=null) ps.close();if(socket!=null) socket.close(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace();/* * 线程的启动

18、方法 */public void run() /产生一个图形化聊天界面chatwindowserverview cws = new chatwindowserverview(socket,br,ps);cws.dopost();/调用cws的dopost方法cws.close();/调用cws的close方法cws.dispose();/将这个聊天窗体摧毁this.close();/调用自己关闭流的方法close3. chatwindowserevrview.java代码:package edu.huaxia.chatview;import java.io*;import .socket;im

19、port java.text.simpledateformat;import java.util.date;import javax.swing.*;/* * author thomas *用户聊天窗体 */public class chatwindowserverview extends jframe implements actionlistenerprivate static final long serialversionuid = 1l;private jlabel l1,l2,l3,l4;private jpanel p1,p2,p3,p4,p5;private textarea

20、ta1,ta2;private jbutton send,quit;private bufferedreader br;private printstream ps;private boolean b=true;/* * 构造器对窗体属性的基本定义 */public chatwindowserverview(socket socket,bufferedreader br,printstream ps)super("神话聊天室服务器");this.br=br;this.ps=ps;l1 = new jlabel("客户ip:"+socket.getloca

21、laddress();l3 = new jlabel("客户名字:"+socket.getlocaladdress().gethostname();l2 = new jlabel("主机ip:"+socket.getinetaddress();l4 = new jlabel("主机名字:"+socket.getinetaddress().gethostname();border b1 = borderfactory.createtitledborder("聊天信息显示窗体");border b2 = borderf

22、actory.createtitledborder("发送信息窗体");border b3 = borderfactory.createtitledborder("对方基本信息");border b4 = borderfactory.createtitledborder("本人基本信息");p1 = new jpanel();p1.setborder(b1);p2 = new jpanel();p2.setborder(b2);p3 = new jpanel();p3.setborder(b3);p4 = new jpanel();p

23、4.setborder(b4);p5 = new jpanel();ta1 = new textarea(10,47);ta2 = new textarea(11,67);font f = new font("default",font.plain,18);ta1.setfont(f);ta1.setforeground(color.red);send = new jbutton("发送");send.addactionlistener(this);/产生监听quit = new jbutton("关闭");quit.addactio

24、nlistener(this);/产生监听this.setlayout(null);this.add(p1);this.add(p2);this.add(p3);this.add(p4);this.add(p5);p1.add(ta1);p2.add(ta2);p3.add(l1);p3.add(l3);p4.add(l2);p4.add(l4);p5.add(send);p5.add(quit);this.setbounds(100,100, 720, 600);p1.setbackground(color.gray);p1.setbounds(0, 0, 500, 280);p3.setb

25、ackground(color.white);p3.setbounds(505, 0, 190, 280);l1.setbounds(507, 5, 187, 30);l2.setbounds(507, 37, 187, 30);p2.setbackground(color.pink);p2.setbounds(0, 290, 500, 220);p4.setbackground(color.light_gray);p4.setbounds(505, 290, 190, 220);l2.setbounds(507, 295, 187, 30);l4.setbounds(507, 327, 18

26、7, 30);p5.setbounds(0, 520, 500, 40);this.setvisible(true);/* * 对监听事件的处理 */public void actionperformed(actionevent e) /发送按钮事件。当发送文本框的值不为空时,就将信息发送为输出流,同时在信息框中打印出来if(e.getsource().equals(send) string s1=null;s1=ta2.gettext().trim();if(!s1.equals("")ta2.settext("");/对时间对象的处理simpleda

27、teformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");date date = new date();/如果得到的是quit就返回方法 if("quit".equalsignorecase(s1) ta1.append("服务器"+sdf.format(date)+":"+"要求断开连接"); ps.println(""+sdf.format(date)+":"+"要求断开连接&quo

28、t;); return; ps.println(""+sdf.format(date)+":"+s1); ta1.append("服务器"+sdf.format(date)+":"+s1+"n"); ps.flush();else if(e.getsource()=quit)/发送按钮事件。将“quit”信息发送为/输出流,同时将b设置为falseps.println("quit");b=false;/* * 接受输入流的信息 */public void dopost()tr

29、y string s=null;simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");date date = new date();ps.println(""+sdf.format(date)+":你好,欢迎光临神话聊天室!");while(b)s=br.readline();if(s!=null|s!="")if("quit".equalsignorecase(s) /若得到的是'quit'就返回t

30、a1.append("客户"+sdf.format(date)+"要求断开连接!n");return;ta1.append("客户"+s+"n"); catch (ioexception e) e.printstacktrace();/* * 流的关闭窗体 */public void close()try if(br!=null) br.close();if(ps!=null) ps.close(); catch (ioexception e) / todo auto-generated catch blocke.

31、printstacktrace();4. clientview.java代码:package edu.huaxia.chatclient;import java.awt.*;import java.io.ioexception;import .socket;import .unknownhostexception; /* * author thomas *启动客户端的窗体 */public class clientview extends jframe private static final long serialversionuid = 1l;private jlabel l0,l1,l2

32、;private jtextfield ip,port;private jbutton start;public clientview()super("客户端启动");l0 = new jlabel("套接字信息");l1 = new jlabel("服务器ip:");l2 = new jlabel("服务器port:");ip = new jtextfield();port = new jtextfield();start = new jbutton("产生客户端");/产生监听,实例化内部类

33、start.addactionlistener(new actionlistener()public void actionperformed(actionevent e) string ip1 = ip.gettext();int port1 = integer.parseint(port.gettext();socket socket = null;try /定义套接字:ip+端口号socket = new socket(ip1,port1);tcpclient tc = new tcpclient(socket);tc.post();tc.close();tc.dispose(); ca

34、tch (unknownhostexception e1) joptionpane.showmessagedialog(null, "套接字错误!"); catch (ioexception e3) joptionpane.showmessagedialog(null, "套接字错误!");try socket.close(); catch (ioexception e1) / todo auto-generated catch blocke1.printstacktrace(););font font = new font("华文楷体&quo

35、t;,font.plain,18);l0.setfont(font);l0.setforeground(color.red);this.add(start);this.add(l0);this.add(l1);this.add(l2);this.add(ip);this.add(port);this.setlayout(null);this.setbackground(color.light_gray);this.setbounds(150, 150, 300, 300);this.setvisible(true);l0.setbounds(100, 15, 100, 30);l1.setbo

36、unds(55, 55, 60, 30);ip.setbounds(135, 55, 100, 30);l2.setbounds(55, 105, 70, 30);port.setbounds(135, 105, 100, 30);start.setbounds(100, 155, 100, 30);public static void main(string args) new clientview();5. tcpclient.java代码:package edu.huaxia.chatclient;import java.awt.*;import java.io*import .sock

37、et;import .unknownhostexception;import java.text.simpledateformat;import java.util.date;import javax.swing.*;/* * author thomas * 客户端窗体 */public class tcpclient extends jframe implements actionlistenerprivate static final long serialversionuid = 1l;private jlabel l1,l2,l3,l4;private jpanel p1,p2,p3,

38、p4,p5;private textarea ta1,ta2;private jbutton send,quit;private bufferedreader br;private printstream ps;private socket socket;private boolean b=true;/* * 客户端窗体的基本属性 */public tcpclient(socket socket)super("神话聊天室客户端");this.socket = socket;try /定义套接字输入输出流br = new bufferedreader(new inputstr

39、eamreader(socket.getinputstream();ps = new printstream(socket.getoutputstream();catch (ioexception e) e.printstacktrace();l2 = new jlabel("客户ip:"+socket.getlocaladdress();l4 = new jlabel("客户名字:"+socket.getlocaladdress().gethostname();l1 = new jlabel("主机ip:"+socket.getin

40、etaddress();l3 = new jlabel("主机名字:"+socket.getinetaddress().gethostname();border b1 = borderfactory.createtitledborder("聊天信息显示窗体");border b2 = borderfactory.createtitledborder("发送信息窗体");border b3 = borderfactory.createtitledborder("对方基本信息");border b4 = borderf

41、actory.createtitledborder("本人基本信息");p1 = new jpanel();p1.setborder(b1);p2 = new jpanel();p2.setborder(b2);p3 = new jpanel();p3.setborder(b3);p4 = new jpanel();p4.setborder(b4);p5 = new jpanel();ta1 = new textarea(10,47);ta2 = new textarea(11,67);font f = new font("default",font.p

42、lain,18);ta1.setfont(f);ta1.setforeground(color.red);send = new jbutton("发送");send.addactionlistener(this);/产生监听quit = new jbutton("关闭");quit.addactionlistener(this);/产生监听this.setlayout(null);this.add(p1);this.add(p2);this.add(p3);this.add(p4);this.add(p5);p1.add(ta1);p2.add(ta2)

43、;p3.add(l1);p3.add(l3);p4.add(l2);p4.add(l4);p5.add(send);p5.add(quit);this.setbounds(100,100, 720, 600);p1.setbackground(color.orange);p1.setbounds(0, 0, 500, 280);p3.setbackground(color.pink);p3.setbounds(505, 0, 190, 280);l1.setbounds(507, 5, 187, 30);l2.setbounds(507, 37, 187, 30);p2.setbackgrou

44、nd(color.darkgray);p2.setbounds(0, 290, 500, 220);p4.setbackground(color.light_gray);p4.setbounds(505, 290, 190, 220);l2.setbounds(507, 295, 187, 30);l4.setbounds(507, 327, 187, 30);p5.setbounds(0, 520, 500, 40);this.setvisible(true);/* * 接受输入流的信息 */public void post() try string s=null;while(b)/对时间对

45、象的处理simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");date date = new date();s=br.readline();if(s!=null|s!="")/如果得到的是quit就返回方法if("quit".equalsignorecase(s) ta1.append("服务器"+sdf.format(date)+"要求断开连接!n");return;ta1.append("服务器&quo

46、t;+s+"n"); catch (unknownhostexception e) / todo auto-generated catch blocke.printstacktrace(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace();/* * 流的关闭 */public void close()try if(br!=null) br.close();if(ps!=null) ps.close();if(socket!=null) socket.close(); cat

47、ch (ioexception e) / todo auto-generated catch blocke.printstacktrace();public static void main(string args) socket socket;try socket = new socket("localhost",6666);tcpclient tc = new tcpclient(socket);tc.post();tc.close();tc.dispose(); catch (unknownhostexception e) / todo auto-generated

48、catch blocke.printstacktrace(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace();/* * 对事件的处理方法 */public void actionperformed(actionevent e) /发送按钮事件。当发送文本框的值不为空时,就将信息发送为输出流,同时在信息框中打印出来if(e.getsource().equals(send) string s1=null;s1=ta2.gettext().trim();if(!s1.equals("&q

49、uot;)ta2.settext("");simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");date date = new date(); if("quit".equalsignorecase(s1) ta1.append("自己"+sdf.format(date)+":"+"要求断开连接"); ps.println(""+sdf.format(date)+":&

50、quot;+"要求断开连接");return; ps.println(""+sdf.format(date)+":"+s1); ta1.append("自己"+sdf.format(date)+":"+s1+"n"); ps.flush();else if(e.getsource().equals(quit)/发送按钮事件。将“quit”信息发送为输出流,同时将b设置为falseb=false;ps.println("quit");this.dispose

51、();4.6 系统实施与运行4.6.1服务器启动与关闭窗体视图见图4,图5,源代码见4.5编码1 图4 图54.6.2客户端产生视图,见图6、7,源代码见4.5.编码4 图6 图74.6.3服务器聊天窗口、客户机聊天窗口大体相似,见图8图84.6.4服务器与客户机交互见图9、10、11图9图10图11客户要求关闭窗体见图12、 13、 14,最后客户端点击关闭,聊天窗口关闭了。图12图13图144.6.4 cmd模式telnet服务器进行和交互,见图15、16、17、18图15图16图17图18图19图20客户输入quit,要求断开连接图21断开连接后客户端窗体为:图22五、设计心得体会 课程

52、设计是对我们平时学习的一种考察,我们要正确地对待。不断地锻炼自己动手动脑的能力、把知识赋予实践就是我们学习的目标! 既然学校给我们这么好的机会,让我们自己在实验室作操作,我们应该好好抓住机会,把我们平时学习的东西用自己的作品展现出来。这次,我做的是简单c/s模式聊天系统的设计,这给了我充分锻炼的机会。我会用自己学到的东西的设计出一副好的作品。 通过四天的制作,我以基本完成了自己的作品。从中我明白:计算机网络是一门非常有趣味的学科,只要你学得好再加上你的编程能力,你就可以开发出很好的软件作品。同时我觉得要学好网络编程,首先要有一颗坚毅的心,有恒心,有信心,在学习过程中,坎坷是避免不了的,但千万不要灰心,不要气馁,要继续努力,刚开始是会感到很无助的,也许会产生放弃的念头,千万顶住,只要克服了开始的难关,以后的路才会充满阳光,充满快乐。 而且,在程序设计过程中我也遇到了很多问题。但是在老

温馨提示

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

评论

0/150

提交评论