毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。
除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。
对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。
本人完全意识到本声明的法律结果由本人承担。
2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。
本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。
3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。
4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。
论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。
论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。
学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。
本人完全了解大学有关保存,使用毕业论文的规定。
同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。
本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。
如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。
本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。
本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入学校有关数据库和收录到《中国学位论文全文数据库》进行信息服务。
在不以赢利为目的的前提下,学校可以适当复制论文的部分或全部内容用于学术活动。
论文作者签名:日期:指导教师签名:日期:长沙理工大学计算机与通信工程学院《网络协议编程》课程设计报告院系计算机与通信工程学院专业网络工程课程设计成绩评定院系计算机与通信工程专业网络工程班级网络1101班学号201158080110学生姓名*** 指导教师***指导教师对学生在课程设计中的评价指导教师成绩指导教师签字年月日课程设计答辩组对学生在课程设计中的评价答辩组成绩答辩组长签字年月日课程设计综合成绩注:课程设计综合成绩=指导教师成绩×60%+答辩组成绩×40%课程设计任务书计算机与通信工程学院网络工程专业基于UDP网络通信系统的服务端程序设计学生姓名:*** 指导老师:***摘要随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。
网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。
本课题是开发一个基于UDP的局域网聊天系统,运用软件工程的设计流程,综合运用数据库编程技术、Windows程序设计技术、网络通讯技术,此网络聊天工具采用客户端/服务器(C/S)模式,客户端采用UDP与服务器连接,客户端与客户端之间通过UDP互相通讯。
服务器端具有服务器端口设置,此聊天工具能实现多人聊天功能,适用于局域网使用的网络聊天工具,其操作简单,灵活性好,运行也比较稳定。
关键词网络通讯;客户端/服务器模型;用户数据报协议;套接字1 引言自进入信息化社会以来,人们的生活发生了翻天覆地的变化,所有这一切的实现都要归功于计算机网络。
自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。
现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在天涯海角,我们也可以随时联系。
一个最简单且应用最广泛的例子——网上聊天,就是最好的证明。
本课程设计将基于UDP 协议和局域网环境,使用Java语言实现一个即时网络通讯程序。
1.1背景介绍随着计算机网络信息技术的日益发展和成熟,人们的生活因为网络而变得更多姿多彩,基于网络的通讯技术也如同雨后春笋般涌现到网络世界中。
TCP协议和UDP协议是网络通讯的基本协议。
而对于普通的信息交流,UDP协议则因为更方便简单,所以常常采用UDP协议开发这类即时通讯程序。
1.2课程设计的目的(1)理解UDP协议的基本功能和工作原理。
(2)培养运用理论知识解决实际问题的能力。
(3)理解UDP协议在Java编程语言中的具体体现。
(4)运用所学的知识,学会分析程序,并从实际上实现即时通讯的要求。
1.3课程设计的基本任务本次课程设计是基于UDP协议的通讯程序,所以其基本任务就是要实现的是服务器和客户端的通讯,即服务器对端口进行监听,客户端发送数据给服务器,服务器接收。
实现了这个过程,就达到了本次课程设计的目的。
2 设计原理2.1 UDP协议原理UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。
UDP 协议基本上是IP协议与上层协议的接口。
UDP协议适用端口分别运行在同一台设备上的多个应用程序。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
一个典型的数据包就是一个二进制数据的传输单位。
每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP是无连接的,即发送数据之前不需要建立连接(当然发送数据结束时也没有连接可释放)因此减少了开销和发送数据之前的时延。
UDP使用的是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
UDP是面向报文的。
发送方的UDP对应程序交下来的报文,在添加首部后就向下交付给IP层。
UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
UDP是定义用来在互连网络环境中提供数据报交换的计算机通信的协议。
此协议默认是IP下层协议。
此协议提供了向另一用户程序发送信息的最简便的协议机制,不需要连接确认和保护复制,所以在软件实现上比较简单,需要的内存空间比起TCP相对较小。
UDP包头由4个域组成,其中每个域各占用2个字节。
(1)源端口号(16位):UDP数据包的发送方使用的端口号。
(2)目标端口号(16位):UDP数据包的接收方使用的端口号。
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和rap协议正是采用这一机制,实现对同一时刻内多项应用同时发送和接收数据的支持。
(3)数据报长度(16位)。
数据报的长度是指包括报头和数据部分在内的总的字节数。
理论上,包含报头在内的数据包的最大长度为65535字节。
不过,一些实际应用往往会限制数据包的大小,有时会降低到8192字节。
(4)校验值(16位)。
UDP协议使用包头中的校验值来保证数据的安全。
2.2客户端/服务器模式客户机一方,UDP应用程序功能如下:(1)打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的UDP进程。
(2)向服务器发出请求报文,等待接收应答。
(3)从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。
服务器一方,UDP应用程序动作如下:(1)打开通信信道(申请一套接字),通知本地主机在某一保留端口接收客户机请求。
(2)等待客户请求到达指定端口。
(3)接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。
(4)继续等待客户机请求。
(5)如果不想响应客户机请求,关闭服务器进程3.设计步骤此次设计是编写一个基于UDP的即时通讯程序,要求双方能够进行即时通讯,实现聊天和传输文件的功能。
本课程设计主要负责的是通讯程序客户端的设计。
其具体设计如下。
3.1 聊天模块设计流程图图1-1 聊天模块流程图3.2详细设计根据UDP协议的基本特性以及Java语言编程特点,然后对比设计流程图,在Eclipse编程环境下编写出实现该即时聊天系统的程序,具体步骤如下:1.打开Eclise创建一个Java工程,命名为UDPChat。
2.在Java工程目录下创建一个package,命名为UDPChat。
3.在此package目录下创建一个类,类名为Client,创建完之后弹出一个编辑窗口,在此编辑环境下编写客户端程序,其聊天模块服务器端核心程序如下:public class Server {public static void main(String[] args) {new UDPServer().start(); //启动服务器}}class UDPServer extends Thread {public UDPServer() { } //缺省构造函数public void run() {try {DatagramSocket socket = new DatagramSocket(80); //建立一个Socket连接,端口号为80System.out.println("服务器IP地址为:" +InetAddress.getLocalHost().getHostAddress()); //得到服务器地址,并打印出来//实现客户端和服务器端的连续通信while (true) {// 接收byte[] instr = new byte[200]; //定义数组,用来保存客户端发送来的数据DatagramPacket receive = new DatagramPacket(instr, instr.length);socket.receive(receive); //接收客户机发过来的数据String str = new String(receive.getData()); //提取数据System.out.println("客户端消息:" + str.trim()); //打印客户机消息// 发送System.out.print("接收到的服务器消息:"); //打印消息str = new BufferedReader(new InputStreamReader(System.in)).readLine(); //得到输入的数据byte[] outstr = new byte[str.length()];outstr = str.getBytes();DatagramPacket send = new DatagramPacket(outstr,outstr.length,receive.getAddress(), receive.getPort()); //向客户机发送数据socket.send(send); //执行发送}} catch (Exception e) {//错误处理e.printStackTrace();}}文件传输模块核心代码如下:public void run() {System.out.println("Connected from " + socket.getRemoteSocketAddress());try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //定义字符流PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); //创建打印对象String inputLine, outputLine;HandleInput handleInput = new HandleInput();outputLine = handleInput.handle(null);out.println(outputLine);while((inputLine = in.readLine()) != null){ //读取信息outputLine = handleInput.handle(inputLine); //每次读一行out.println(outputLine);out.flush();if(outputLine.equals("bye")) //结束标志break;if(outputLine.equals("password:valid")){//prepare for the transmission of the fileThread.sleep(2000); /线程休眠InputStream fileInput = new FileInputStream(new File(DEFAULT_FILE_NAME)); //创建字节输入流OutputStream fileOutput = new DataOutputStream(newBufferedOutputStream(socket.getOutputStream())); //创建字节输出流byte[] buf = new byte[2048];//transmit the fileint num = fileInput.read(buf);while(num != -1){fileOutput.write(buf, 0, num);fileOutput.flush();num = fileInput.read(buf);}fileInput.close(); //关闭输入流fileOutput.close(); //关闭输出流}}in.close();out.close();System.out.println("Disconnected from " + socket.getRemoteSocketAddress());socket.close(); //关闭套接字} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private class HandleInput{private Map userInfo = new HashMap(); //定义一个mapprivate String username = "";private String password = "";public HandleInput(){userInfo.put("me", "me"); //定义用户名密码userInfo.put("abc", "abc");userInfo.put("123", "123");}public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(port); //创建一个ServerSocketSystem.out.println("Server Started");try {while(true){Socket theSocket = serverSocket.accept(); //等待连接try {new SimpleServer(theSocket);} catch (Exception e) {e.printStackTrace();theSocket.close();}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {if(serverSocket != null)serverSocket.close(); //关闭连接}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.3 运行程序运行程序,要结合服务器端程序,运行服务器端程序,结果如图1-2。