《课程设计(论文)基于UDP客户端通讯.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于UDP客户端通讯.doc(23页珍藏版)》请在三一办公上搜索。
1、 课 程 设 计 报 告课程设计名称: 计算机网络 系 : 三系 学生姓名: 吴宗琦 班 级: 12通信2 学 号: 20120306217 成 绩: 指导教师: 陈林 开课时间: 20142015 学年 1 学期目 录一 引言11.1 背景介绍11.2 课程设计的目的11.3 课程设计的基本任务1二 开发环境介绍32.1 Java简介32.2 Java的特点3三 UDP协议及套接字43.1 UDP协议简介43.2 UDP协议结构与特点53.3 UDP建立63.4 客户机/服务器模式73.5 套接字编程原理7四 设计过程94.1 总体设计流程图94.2 详细设计114.3 运行程序。184.4
2、 结果分析20五 心得与体会21一 引言自进入信息化社会以来,人们的生活发生了翻天覆地的变化,所有这一切的实现都要归功于计算机网络。自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在天涯海角,我们也可以随时联系。一个最简单且应用最广泛的例子网上聊天,就是最好的证明。此课程设计将基于UDP协议和局域网环境,使用Java语言实现一个即时网络通讯程序。 1.1 背景介绍随着计算机网络信息技术的日益发展和成熟,人们的生活因为网络而变得更多
3、姿多彩,基于网络的通讯技术也如同雨后春笋般涌现到网络世界中。TCP协议和UDP协议是网络通讯的基本协议。而对于普通的信息交流,UDP协议则因为更方便简单,所以常常采用UDP协议开发这类即时通讯程序。在国内占据网络通讯霸主地位则是腾讯公司的QQ原型,就是采用UDP协议开发而成的。 1.2 课程设计的目的(1)通过本课程设计,熟练掌握Java语言的编程技术、步骤和程序的编写与调试过程。(2)理解UDP协议的基本功能和工作原理。(3)培养运用理论知识解决实际问题的能力。(4)理解UDP协议在Java编程语言中的具体体现。(5)运用所学的知识,学会分析程序,并从实际上实现即时通讯的要求。 1.3 课程
4、设计的基本任务本次课程设计是基于UDP协议的通讯程序,所以其基本任务就是要实现的是服务器和客户端的通讯,即服务器对端口进行监听,客户端发送数据给服务器,服务器接收。实现了这个过程,就达到了本次课程设计的目的。二 开发环境介绍 2.1 Java简介Java是一种简单易用、完全面向对象、具有平台无关性且安全可靠的主要面向Internet的开发工具。Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C+语言的优点,并增加了其它特性。JJava平台是基于Java语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C
5、#语言。Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java分为三个体系J2SE,J2EE,J2ME。 2.2 Java的特点Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C+语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。其主要特性如下:(1)Java语言是简单的。(2)Java语言是面向对象的。(3)Java语言是分布式的。(4)Java语言是健壮的。(5)Java语言是
6、安全的。(6)Java语言是体系结构中立的。(7)Java语言是可移植的。(8)Java语言是解释型的。(9)Java语言是高性能的。(10)Java语言是多线程的。(11)Java语言是动态的。三 UDP协议及套接字 3.1 UDP协议简介 UDP协议和TCP协议是Internet的传输层上的两个主要的协议,其中前者是无连接的协议,后者是面向连接的协议。UDP是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。UDP用户数据报协议,是一个简单的面向数据报传输层的协议。UDP提供不可靠的连接,它只是把应用程序传给IP层
7、的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将 UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使
8、用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为 UDP 报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。 数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。 UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算
9、法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。其实在UDP协议中校验功能是可选的,如果将其关闭可以使系统的性能有所提升。这与TCP协议是不同的,后者要求必须具有校验值。 3.2 UDP协议结构与特点数据报由报头和传输的数据组成。UDP报头由4个域组成,其中每个域各占用2个字节,具体包括:源端口号、目标端口号、数据报长度、校验值。 源端口 16位。源端口是可选字段。当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。如
10、果不使用,设置值为0。 目标端口 16位。目标端口在特殊因特网目标地址的情况下具有意义。 数据报长度 16位。该用户数据报的八位长度,包括协议头和数据。长度最小值为8。 校验和 16位。IP 协议头、UDP 协议头和数据位,最后用0填补的信息假协议头总和。如果必要的话,可以由两个八位复合而成。 数据域 包含数据信息。 UDP协议得到了广泛的应用。其特点如下:1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。2、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达
11、的,所以接收端无从排起。3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。4、UDP传送数据较TCP快速,系统开销也少。5、由于缺乏拥塞控制(congestion control),需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方
12、式,是一种尽力而为的数据交付服务。3.3 UDP建立UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其他信息,否则将一直等待直到收到确认信息为止。与 TCP 不同,UDP 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示,因此,通常人们把UDP协议称为不可靠的传输协议。 相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突发性的多个数据报。不同于TCP,UD
13、P并不能确保数据的发送和接收顺序。 当客户端需要用到一个使用UDP协议的远程主机上的应用程序时,它需要知道两方面的信息:应用程序所在主机的IP地址和应用程序目的端的UDP端口号。现在,假设一台主机知道应用程序在另一台IP地址为128.1.123.1的主机上。在获得了IP地址后,它需要知道应用程序的目的端口号是多少。所有的UDP端口号和TCP端口号都存放在一种称为服务文件(Service File)的文件中。在UNIX系统中,服务文件通常位于/etc/services下。在Windows xp主机中,可以在c:windowssystem32driversetc下找到服务文件。服务文件包括了应用程
14、序到TCP端口号和到UDP端口号的所有映射。当一个主机需要知道应用程序的目的UDP端口号和目的TCP端口号时,它会搜索服务文件来找出正确的端口号。通常应用程序将它们各自的UDP端口号或TCP端口号安装在这个服务文件中。 由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用 UDP 的“端口号”完成的。例如,如果一个客户希望在服务器128.1.123.1上使用域名服务系统,它就会给数据包一个目的地址 128.1.123.1 ,并在 UDP 头插入目标端口号 53 。源端口号标识了请求域名服务的
15、本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。 3.4 客户机/服务器模式传输层的通信有时也称为客户端/服务器端通信。典型情况是一个主机(客户端)需要使用另一个主机(服务器)上的应用程序。当客户端需要用到一个使用UDP协议的远程主机上的应用程序时,它需要知道两方面的信息:应用程序所在主机的IP地址和应用程序目的端的UDP端口号。其工作过程描述如下:服务器端描述:S端启动服务进程,并监听相应端口。然后,若收到C端发出的有关请求,按如下情况给出相应的反映:将收到的包进行检测,若收到的包有错则抛弃(discard),并发给C端一个negtive ACK。若收到的包正
16、常,则将此包进行解包,将内容输出至一临时文件;并发给C端一个positive ACK。依次收到来自C端的包,直到收到end为止,并关闭此进程,转回监听状态。客户端描述为:若收到的为Positive ACK,则继续发包;若收到的为Negtive ACK,则将应发的包重发。直到C端将所有要发的包都发完,并都已经收到S端的回应,最后发一个End包,直接关闭此进程。综上所述,应用中的服务器程序必须先于客户机进程启动,直到对客户机的响应结束或强迫终止。3.5 套接字编程原理 socket/套接字 socket提供了在主机之间传递原始字节流的功能,以比较底层的方式访问UDP协议层.可以类似访问文件I/0的
17、方式实现这一功能。UDP协议规定,每台主机都有一个名称,然而,同一台主机上有可能同时运行很多UDP程序.每个socket被指派了一个叫做端口的数字以加以区分不同的应用或者连接.http应用服务器的端口一般被指定为80,DbAnywhere通常指定为8889.我们通过这种方式区分你向远程或者本地主机请求连接的服务.一个socket被定义为 地址:端口, 例如 :88891、创建套接字socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);参数:af: 通信发生的区域type: 要建立的套接字
18、类型procotol: 使用的特定协议2、建立套接字连接connect()和accept()功能:共同完成连接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);3、监听连接listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:int PASCAL FAR listen(SOCKET s, int backlo
19、g);4、数据传输send()与recv()功能:数据的发送与接收格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);参数:buf:指向存有传输数据的缓冲区的指针。 四 设计过程此次设计是编写一个基于UDP的即时通讯程序,要求双方能够进行即时通讯,实现聊天。本课程设计主要负责的是通讯程序客户端的设计。其具体设计如下。4.1 总体设计流程图 即时通讯程序客户端/服务器端
20、总体设计流程图如图1。服务器端设计程序得出当前服务器的地址客户端输入所要连接的服务器地址地址是否相同输入客户端发送的信息设置服务器端端口号为80接收客户端发送的消息,发出服务器消息设置客户端端口号为80接收服务器发送到消息,发出客户端消息接受客户端发送的消息,发出服务器消息消息内容是否为NULL结束通讯图1 总体设计流程图4.2 详细设计根据UDP协议的基本特性以及Java语言编程特点,然后对比设计流程图,在Eclipse编程环境下编写出实现该即时聊天系统的程序,具体步骤如下:1.打开Eclise创建一个Java工程,命名为UDPChat。2.在Java工程目录下创建一个package,命名为
21、UDPChat。3.在此package目录下创建一个类,类名为Client,创建完之后弹出一个编辑窗口,在此编辑环境下编写客户端程序。客户端核心程序如下:public static void main(Stringargs)new UDPClient().start(); /调用UDPClient()函数,启动客户端class UDPClient extends Threadpublic UDPClient()public void run()/和服务器之间进行连接System.out.print(请输入所要通讯的服务器的地址:);String serverip=null; /定义一个数组,用
22、来保存服务器地址,初始化为NULL./进行异常处理tryserverip=new BufferedReader(new InputStraemReader(System.in).readLine();/取得输入的服务器地址catch(IOException el)/错误处理el.printStackTrace();finallytryDatagramSocket socket=new DatagramSock();/建立Socket连接/实现服务器和客户端程序间的不间断通讯while(true)/发送消息 System.out.print(客户端发送的消息为:); /打印消息 String s
23、end=new BuffredReader(new InputStreamReader(System.in).readLine();/读入客户机输入的消息 byteoutstr=new bytesend.length();/定义一个字节数组,长度为客户端所发送的消息长度 outstr=send.getBytes();/讲得到的客户端消息保存数组中 InetAddress address=InetAddress.getByName(serverip); DatagramPacket packet=new DatagramPack(outstr,outstr.length,address,80);
24、/向服务器发送数据报 socket.send(packet);/发送数据报 /接收 byteinstr=new byte200; /定义数组,用来保存接受的数据报 pack=new DatagramPack(instr,instr.length);/接收数据报 socket.receive(packet);/接收数据 String out=new String(packetgetData(),0,packet.getLength();/取出信息 System.out.println(接收到的服务器消息:+out);/打印服务器发过来的信息 catch(Exception e) /错误处理 e.
25、printStackTrace(); 客户端程序设计清单 :/程序名称:Client.java/程序功能:实现UDP即时通讯客户端的功能package com.briup.gui;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class Client public static void main(String arg
26、s) new UDPClient().start(); /调用UDPClient()函数,启动客户端 class UDPClient extends Thread public UDPClient() public void run() /和服务器之间进行连接 System.out.print(请输入所要通讯的服务器的地址:); String serverip = null; /定义一个数组,用来保存服务器地址,初始化为NULL. /进行异常处理 try serverip = new BufferedReader(new InputStreamReader(System.in).readLin
27、e(); /取得输入的服务器地址 catch (IOException e1) /错误处理 e1.printStackTrace(); finally try DatagramSocket socket = new DatagramSocket(); /建立Socket连接 /实现服务器和客户端程序间的不间断通讯 while (true) / 发送 System.out.print(客户端发送的消息为:); /打印消息 String send = new BufferedReader(new InputStreamReader(System.in).readLine(); /读入客户机输入的消
28、息 byte outstr = new bytesend.length(); /定义一个字节数组,长度为客户端所发送的消息长度 outstr = send.getBytes(); /将得到的客户端消息保存数组中 InetAddress address = InetAddress.getByName(serverip); DatagramPacket packet = new DatagramPacket(outstr, outstr.length, address, 80); /向服务器发送数据报 socket.send(packet); /发送数据报 / 接收 byte instr = ne
29、w byte200; /定义数组,用来保存接受的数据报 packet = new DatagramPacket(instr, instr.length); /接收数据报 socket.receive(packet); /接收数据 String out = new String(packet.getData(),0,packet.getLength(); /取出信息 System.out.println(接受到的服务器消息: + out); /打印服务器发过来的信息 catch (Exception e) / 错误处理 e.printStackTrace(); 服务器端程序设计清单:packag
30、e com.briup.gui;import java.io.BufferedReader;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class Server public static void main(String args) new UDPServer().start(); /启动服务器 class UDPServer extends Thread public UDPServer() /缺省构造函数 public v
31、oid run() try DatagramSocket socket = new DatagramSocket(80); /建立一个Socket连接,端口号为80 System.out.println(服务器IP地址为: + InetAddress.getLocalHost().getHostAddress(); /得到服务器地址,并打印出来 /实现客户端和服务器端的连续通信 while (true) / 接收 byte instr = new byte200; /定义数组,用来保存客户端发送来的数据 DatagramPacket receive = new DatagramPacket(i
32、nstr, 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 bytes
33、tr.length(); outstr = str.getBytes(); DatagramPacket send = new DatagramPacket(outstr,outstr.length, receive.getAddress(), receive.getPort(); /向客户机发送数据 socket.send(send); /执行发送 catch (Exception e) /错误处理 e.printStackTrace(); 4.3 运行程序。 运行服务端程序和客户端程序,结果如图2图2 服务器程序运行结果运行客户端程序,得出客户端如图3。图3 客户端程序运行结果客户端对话框
34、输入所要连接的服务器的IP地址,进行客户端和服务器端的连接,连接后,出现如图4结果。接下来,客户端和服务器端进行连接后,可以进行正常的聊天了。4.4 结果分析根据以上程序的执行情况可知,服务器端和客户端实现成功的连接。根据客户端和服务器端的通许状况可知,所设计的即时通讯程序符合要求,达到了预期的目标。五 心得与体会刚开学的计算机网络课程的学习,觉得这门课程难度较大,学了也没什么用,缺乏学习兴趣,没有好好的学。但是做了这次课程设计,我才后悔当初自己没有好好学习。这次的课程设计使我明白了知识的重要性,通过在网上收集资料和整理资料时,满怀期待。以为可以运行成功。可是在运行过程中碰到了许多许多的问题。现在我开始后悔当初没有好好学习这门课程。我们要经常把所学的知识运用到实践,这样,才能充分的融会贯通。同时,也使我认识到自己动手能力太差,为我以后的学习和发展提供了一个警钟! 最后,在这里,我要感谢学校为我们提供了这种锻炼自己的机会,同时也感谢老师对我的指导和同学们帮助,希望这样的锻炼的机会还有下次。