基于java的UDP协议编程.doc

上传人:h**** 文档编号:130923 上传时间:2018-07-09 格式:DOC 页数:107 大小:636.50KB
下载 相关 举报
基于java的UDP协议编程.doc_第1页
第1页 / 共107页
基于java的UDP协议编程.doc_第2页
第2页 / 共107页
基于java的UDP协议编程.doc_第3页
第3页 / 共107页
基于java的UDP协议编程.doc_第4页
第4页 / 共107页
基于java的UDP协议编程.doc_第5页
第5页 / 共107页
点击查看更多>>
资源描述

1、 1 基于 Java 的 UDP 协议编程 摘要: 用户数据包协 议 ( UDP 协议, User Datagram Protocol) 是 TCP/IP 协议族中 的 一种,是 工作在传输层的 面向无连接的 协议。 UDP 协议的主要作用是将 网络数据 流量压缩成数据包的形式 。 本文将详细介绍基于 Java 语言的 UDP 协议 编程 ,实现 UDP 协议的功能。 关键字: UDP, Java, UDP 协议编程 Base on Java Language of UDP Programming Abstract: The User Datagram Protocol (UDP) is on

2、e kind of the Internet Protocol Suite. It is a connectionless protocol which is working on the Transport Layer. The main role of UDP is making network data stream be compressed into the form of data packet. This paper introduces UDP Programming which based on Java language and achieves its function

3、with Java language in detail. Key words: UDP, Java, UDP Programming 1 引言 如今,人们可以通过电脑来打电话,看电视,给朋友发送即时信息,与其他人玩游戏,甚至可以通过电脑买到你能想到的任何东西。计算机程序能够通过互联网相互通信使这一切成为了可能。很难统计现在有多少个人电脑接入互联网,但可以肯定,这个数量增长得非常迅速。除此之外,新的应用程序每天在互联网上层出不穷。随着日益增加的互联网访问带宽,我们可以预见,互联网将会对人们将来的生活产生长远的影响。 那么程序是如何通过网络进行相互通信的呢? 各个孤立 的工作站或主机用物理链路相

4、连在一起,组成 数据链路 ,从而达到 资源共享 和通信的目的 ,就形成网络。 通信是人与人之间同过某种媒体进行的信息交流与传递。网络通信一般指 网络协议 。 当今网络协议有很多 ,其中 基本最常用的就是 TCP/IP 协议族。 UDP协议就是属于 TCP/IP协议族中的协议。 在网络中它与 TCP协议一样用于处理数据包。在 OSI模型中, UDP协议 在第四层 传输层,处于IP协议的上一层。 与 TCP相比, UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的 。 本文利用 Java语言网络编程的思想,编写 UDP协议程序,实现

5、UDP协议在网络中所要完成的功能。 在 Java语言 为 实现程序的相互通信提供了许多有用的抽象应用程序接口( API, Application Programming Interface),这类应用程序接口被称为套接字( sockets)。 因此,本文 UDP协议的编程所需要用到的接口就是套接字。 2 2 UDP的介绍 2.1 UDP 简介 UDP 是 User Datagram Protocol 的简称, 中文 全称是用户数据包协议, 是 一种无连接的传输层协议 , 提供面向事务的简单不可靠信息传送服务 。 在 网络 中它与 TCP 协议一样用于处理数据包 。 在 OSI 模型中, UDP

6、 协议 在第四层 传输层,处于 IP 协议的上一层。 与 TCP 相比, UDP 有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的 。 UDP 用来支持那些需要在计算机 之间传输数据的网络应用。包括 网络视频会议 系 统在内的众多的客户 /服务器模式的网络应用都需要使用 UDP 协议。 2.2 使用 UDP 的原因 (特点) UDP 协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天, UDP 仍然不失为一项非常实用和可行的网络传输层协议。 这是因为 UDP 有以下特点: ( 1) .UDP

7、是一个 无连接协议 ,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 ( 2) .由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。 ( 3) . UDP 信息包的标题很短,只有 8 个字节,相对于 TCP 的 20 个字节信息包的额外开销很小。 ( 4) . 吞吐量不受拥挤控制算法的调节,只受 应用软件 生 成数据的速率、传输带宽、源端和终端主机性能的限制。 ( 5) . UDP 使用 尽最大努力交付, 即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有

8、许多参数)。 ( 6) . UDP 是 面向报文 的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。既 不 拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选 择合适的报文大小 。 2.3 UDP 套接字 UDP协议提供了一种不同于 TCP协议的端到端服务。实际上 UDP协议只实现两个功能: (1).在 IP协议的基础上添加了另一层地址(端口) ; (2).对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。 由于其简单性, UDP套接字具有一些与我们之前所看到的 TCP套接字不同的特征。例如 , UDP套接字在使用前不需要进行连接。

9、TCP协议与电话通信相似,而 UDP协议则与邮件通信相似:你寄包裹或信件时不需要进行 “ 连接 ” ,但是你得为每个包裹和信件指定目的地址 。类似的,每条信息(即数据报文, datagram)负载了自己的地址信息,并与其他信息相互独3 立。在接收信息时, UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建, UDP套接字就可以用来连续地向不同的地址发送信息,或从任何地址接收信息。 UDP套接字与 TCP套接字的另一个不同点在于他们对信息边界的处理方式不同: UDP套接字将保留边界信息。这个特性使应用程序在接受信息时,从某些方面来说比使用 TCP套接字更

10、简单。 最后一个不同点是, UDP协议所提供的端到端传输服务是尽力而为( best-effort)的,即 UDP套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。因此,使用了 UDP套接字的程序必须准备好处理信息的丢失和重排。 3 UDP 协议编程 3.1 在 Java中 UDP 协议编程 可 使用的相关类 3.1.1 InetAddress 用于描述和包装一个 Internet IP 地址。有如下方法返回实例: getLocalhost():返回封装本地地址的实例。 getAllByName(String h

11、ost):返回封装 Host 地址的 InetAddress 实例数组。 getByName(String host):返回一个封装 Host 地址的实例。其中, Host 可以是域 名或者是一个合法的 IP 地址。 InetAddress.getByAddress(addr):根据地址串返回 InetAddress 实例。 InetAddress.getByAddress(host, addr):根据主机地符串和地址串返回 InetAddress 实例。 3.1.2 DatagramSocket 用于接收和发送 UDP 的 Socket 实例 。该类有 3 个构造函数: DatagramSo

12、cket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。 DatagramSocket(int port):创建实例,并固定监听 Port 端口的报文。通常用于服务端 。 DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个 IP 地址的时候,由它创建的实例仅仅接收来自 LocalAddr 的报文。 4 DatagramSocket 具有 的主要方法如下: (1)receive(DatagramPacket d):接收数据报文到 d 中。 rece

13、ive 方法产生一个 “ 阻 塞 ” 。它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。 (2)send(DatagramPacket dp):发送报文 dp 到目的地。 (3)setSoTimeout(int timeout):设置超时时间,单位为毫秒。 (4)close():关闭 DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭 Socket,但是由于异常地退出可能造成资源无法 回收。所以,应该在程序完成时,主动使用此方法关闭 Socket,或在捕获到异常抛出后关闭 Socket。 3.1.3 DatagramPacket 用于处理报文,它将 By

14、te 数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成 Byte 数组。应用程序在产生数据包是应该注意, TCP/IP 规定数据报文大小最多包含 65507 个,通常主机接收 548 个字节,但大多数平台能够支持 8192 字节大小的报文。 DatagramPacket 类的构建器共有 4 个: DatagramPacket(byte buf, int length):将数据包中 Length 长的数据装进 Buf 数组,一般用来接收客户端发送的数据。 DatagramPacket(byte buf, int offset, int length):将数据包中从 Offset 开始、

15、Length 长的数据装进 Buf 数组。 DatagramPacket(byte buf, int length, InetAddress clientAddress, int clientPort):从 Buf 数组中,取出 Length 长的数据创建数据包对象,目标是 clientAddress 地址, clientPort 端口 ,通常用来发送数据给客户端。 DatagramPacket(byte buf, int offset, int length, InetAddress clientAddress, int clientPort):从 Buf 数组中,取出 Offset 开始的

16、、 Length 长的数据创建数据包对象,目标是 clientAddress 地址, clientPort 端口,通常用来发送数据给客户端。主要的方法如下: (1) getData(): 从实例中取得报文的 Byte 数组编码。 (2) setDate(byte buf):将 byte 数组放入要发送的报文中 5 3.2 流程图 UDP 应用程序 原理 图(如图 1 所示) 图 1 UDP 应用程序流程图 (如图 2 所示) D a t a g r a m S o c k e t S S o c k e t = n e w D a t a g r a m S o c k e t ( S e r

17、 v e r P o r t ) ;S S o c k e t . r e c e i v e ( S p a c k e t ) ;D a t a g r a m P a c k e t S p a c k e t = n e w D a t a g r a m P a c k e t ( b u f , b u f . l e n g t h ) ;C S o c k e t . r e c e i v e ( C p a c k e t ) ;D a t a g r a m P a c k e t C p a c k e t = n e w D a t a g r a m P a c k

18、 e t ( b u f , b u f . l e n g t h , a d d r e s s , S e r v e r P o r t ) ;D a t a g r a m S o c k e t C S o c k e t = n e w D a t a g r a m S o c k e t ( ) ;C S o c k e t . s e n d ( C p a c k e t ) ;S S o c k e t . s e n d ( S e n d p a c k e t ) ;C S o c k e t . c l o s e ( ) ;C S o c k e t . c

19、l o s e ( ) ;D a t a g r a m P a c k e t S e n d p a c k e t = n e w D a t a g r a m P a c k e t( b u f , b u f . l e n g t h , a d d r e s s , C l i e n t P o r t ) ;D a t a g r a m P a c k e t R e c _ p a c k e t = n e w D a t a g r a m P a c k e t ( b u f , b u f . l e n g t h ) ;图 2 6 3.3 实例解析 3

20、.3.1 UDP服务器端 UDP服务器要执行以下三步: ( 1) .创建一个 DatagramSocket实例,指定本地端口号,并可以选择指定本地地址。此时,服务器已经准备好从任何客户端接收数据报文。 ( 2) .使用 DatagramSocket类的 receive()方法老接收一个 DatagramPacket实例。当 receive() 方法返回时 ,数据报文就包含了客户端的地址与端口,这样我们就知道回复信息该发送到什么地方。 ( 3) .使用 DatagramSocket类的 send()和 receive()方法发送和接收DatagramPacket实例,进行通信。 /服务器类 UD

21、PServerBean.java package UDP; import java.io.*; import .*; public class UDPServerBean private DatagramSocket dSocket; private int ClientPort; private int ServerPort; private InetAddress ServerIP; private InetAddress ClientIP; private String content; / 无参构造函数 public UDPServerBean() throws SocketExcep

22、tion,UnknownHostException ClientPort = 1111; ServerPort = 1001; content = “; ClientIP = InetAddress.getLocalHost(); ServerIP = InetAddress.getLocalHost(); dSocket = new DatagramSocket(ServerPort); / 信息发送函数,将接收到的信息发回给用户 public void sendToClient() throws IOException byte Buffer = (“服务器已经收到: n “+conten

23、t).getBytes(); / 将要发送的信息给 Buffer变量 DatagramPacket dPacket = new DatagramPacket(Buffer,Buffer.length,getClientIP(),getClientPort(); /创建 DatagramPacket对象 dPacket,并设置客户机的 IP地址与端口号 7 dSocket.send(dPacket); /发送信息 / 以下全是 UDPServerBean类的各个成员变量的 get和 set方法 public InetAddress getServerIP() return ServerIP; p

24、ublic void setServerIP(InetAddress serverIP) throws Exception ServerIP = serverIP; public DatagramSocket getdSocket() return dSocket; public void setdSocket(DatagramSocket dSocket) this.dSocket = dSocket; public int getClientPort() return ClientPort; public void setClientPort(int clientPort) ClientP

25、ort = clientPort; public int getServerPort() return ServerPort; public void setServerPort(int serverPort) throws SocketException ServerPort = serverPort; public String getContent() return content; public void setContent(String content) this.content = content; public InetAddress getClientIP() return

26、ClientIP; 8 public void setClientrIP(InetAddress clientIP) ClientIP = clientIP; /服务器端代码, UDPServer.java package UDP; import java.awt.*; import java.awt.event.*; import java.io.*; import .*; import javax.swing.*; public class UDPServer extends JApplet private UDPServerBean server; private Thread thre

27、ad; private JTextField jtf_ServerPort = new JTextField(10); private JButton jbt_Strat = new JButton(“启动 “); private JButton jbt_Exit= new JButton(“退出 “); private JTextArea jta_Server = new JTextArea(); public UDPServer() JPanel jplServer11 = new JPanel(); jplServer11.add(new JLabel(“服务器端口 :“); jplSe

28、rver11.add(jtf_ServerPort); JPanel jplServer21= new JPanel(); jplServer21.add(jbt_Strat); jplServer21.add(jbt_Exit); JPanel jplServer0= new JPanel(); jplServer0.setLayout(new GridLayout(2,1); jplServer0.add(jplServer11,BorderLayout.NORTH); jplServer0.add(jplServer21); add(jplServer0,BorderLayout.NOR

29、TH); 9 add(new JScrollPane(jta_Server),BorderLayout.CENTER); / 使用线程 thread = new Thread(new Runnable() public void run() receiveForemClient(); /调用发送函数 ); /启动按钮事件 jbt_Strat.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) int serPort = Integer.parseInt(jtf_ServerPort.

30、getText(); / 从jtf_ServerPort文本区中取服务器的端口号 try server = new UDPServerBean(); /创建服务器 UDPServerBean的类对象 server.setServerPort(serPort); /将取得的服务器端口 serPort给 server对象 jta_Server.setText(“设置服务器端口为 “+jtf_ServerPort.getText()+“ ,服务器开启 .n“); / 将服务器端设置好的信息显示在 jta_Server文本域中 thread.start(); /启动线程 catch (SocketEx

31、ception e2) e2.printStackTrace(); catch (UnknownHostException e1) e1.printStackTrace(); catch (Exception e1) e1.printStackTrace(); ); / 退出按钮的触发事件 jbt_Exit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0); ); / 接收客户端的信息,并将接收到的信息发回给客户机 public void receiv

32、eForemClient() String rec_str = null; 10 byte Buffer = new byte 1024; try server.setdSocket(new DatagramSocket(server.getServerPort(),server.getServerIP(); / server对象调用 setdSocket()函数,创建新 Socket对象 (此时服务器端口号为设定的端口号 ) catch (SocketException e) e.printStackTrace(); DatagramPacket dPacket = new Datagram

33、Packet(Buffer,Buffer.length); /创建 DatagramPacket对象 dPacket while(true) / 用循环监听信息接收 try server.getdSocket().receive(dPacket); /接受信息,将接收到的信息存放在 dPacket对 象中 rec_str = new String(dPacket.getData(),0,dPacket.getLength(); /取出 dPacket对象中接收到的信息 server.setClientPort(dPacket.getPort(); / 将 dPacket对象中包含的客户机的端口

34、号给 server对象 server.setClientrIP(dPacket.getAddress(); / 将 dPacket对象中包含的客户机的 IP给 server对象 server.setContent(rec_str); / 将接收的信息给 server对象 jta_Server.setText(jta_Server.getText()+“收到 IP地址为 “+server.getClientIP()+“,端口为 “+server.getClientPort()+“ 的客户机的信息有: n “+rec_str+“n“); / 将客户机的信息与接收的信息显示在 jta_Server文

35、本域中 server.sendToClient(); /将信息发送回去 catch (IOException e) e.printStackTrace(); 3.3.2 UDP客户端 UDP客户端首先向被动等待联系的服务器端发送一个数据报文。一个典型的 UDP客户端主要执行以下三步: (1).创建一个 DatagramSocket实例,可以选择对本地地址和端口号进行设置。 (2).使用 DatagramSocket类的 send()和 receive()方法来发送和接收DatagramPacket实例,进行通信。 (3).通信完成后,使用 DatagramSocket类的 close()方法来销毁该套接字。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。