基于UDP协议的Socket通信.ppt_第1页
基于UDP协议的Socket通信.ppt_第2页
基于UDP协议的Socket通信.ppt_第3页
基于UDP协议的Socket通信.ppt_第4页
基于UDP协议的Socket通信.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、基于UDP协议的Socket通信,2,本章内容,UDP协议的基本概念 2. UDP数据报套接字DatagramSocket DatagramSocket的构造方法和主要方法 DatagramSocket的选项设置 UDP数据报DatagramPacket DatagramPacket的构造方法和主要方法 传递基本类型数据和对象 UDP协议通信基本过程 4. 组播的基本概念及实现,3,UDP协议,用户数据报协议(UDP)是一种基本的、低延时的数据传输协议。 UDP的简单性不能保证数据传输的可靠性,但对另一些更复杂的、自身提供面向链接功能的应用却很适合。 UDP协议适合以下情况:转发路由表、数据交

2、换、网络监控数据、网络电话应用等的交换。这些类型的交换不需要流控、应答、重排序或任何TCP提供的功能。,4,UDP协议以数据报作为数据传输的载体。它是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。UDP协议无需在发送方和接收方建立连接,数据报在网上可以以任何可能的路径传往目的地(分组交换)。 基于UDP协议实现网络通信的类有三个: DatagramSocket DatagramPacket MulticastSocket,UDP协议-数据报通信,邮局A,包裹A,包裹B,包裹C,邮局D,邮局B,邮局C,5,DatagramSocket,public Datagram

3、Socket() 创建数据报套接字并将其绑定到本地主机的匿名端口。 public DatagramSocket(intport) 创建数据报套接字并将其绑定到本地主机上的指定端口。 public DatagramSocket(intport, InetAddressladdr) 创建数据报套接字,将其绑定到指定的IP地址和端口。 public DatagramSocket(SocketAddress bindaddr) 创建数据报套接字,SocketAddress表示了要绑定的套接字地址。 注意:以上方法都将抛出例外SocketException。,6,public void receive(

4、DatagramPacketp) throws IOException 此方法接收数据报包。当方法返回时,DatagramPacket 的缓冲区填充了接收的数据。此方法在接收到数据前一直阻塞。 public void send(DatagramPacketp) throws IOException 此方法发送数据报包。DatagramPacket 包含的信息指示将要发送的数据、长度、远程主机的 IP 地址及其端口号。 抛出异常的可能性小,除非发送的数据报超过了底层网络所支持的数据报的大小。 Exception in thread “main” .SocketException: The mes

5、sage is larger than the maximum supported by the underlying transport,DatagramSocket接收和发送数据,7,用于接收数据的数据包 public DatagramPacket(bytebuf, intlength) 用来接收长度为 length 的数据包,放入buf字节数组中 public DatagramPacket(bytebuf, intoffset, intlength) 用来接收长度为 length 的数据包,在缓冲区中指定了偏移量。 (length=buf.length-offset) 用于发送数据的数据

6、包 public DatagramPacket(bytebuf, intlength, InetAddress address, intport) 用来将长度为 length 的数据报发送到指定主机上的指定端口号。 public DatagramPacket(bytebuf, intoffset, intlength, InetAddressaddress, intport) 用来将长度为 length,偏移量为 offset 的数据报发送到指定主机上的指定端口号。 见源文件:udp/UDPSend.java UDPReceive.java,DatagramPacket,8,int getLo

7、calPort() 返回此套接字绑定的本地主机上的端口号。 InetAddress getLocalAddress() 获取套接字绑定的本地地址。 SocketAddress getLocalSocketAddress() 返回SocketAddress对象,它包含DatagramSocket所绑定的IP地址和端口。 void connect(InetAddress host,int port) 限制当前DatagramSocket只对参数指定的远程主机和端口收发数据报。如果对其他DatagramSocket发送数据,send()方法抛出IllegalArgumentException。接收到

8、的数据报会抛弃,程序不会得到通知,也不会抛出异常。,DatagramSocket的主要方法,9,void disconnect() 解除当前DatagramSocket与特定主机建立的“连接”,以后可对其他任何DatagramSocket收发数据报。 int getPort() 返回远程的端口(当且仅当DatagramSocket建立了“连接”,否则返回-1)。 InetAddress getInetAddress() 返回远程的IP地址(当且仅当DatagramSocket建立了“连接”,否则返回null)。 SocketAddress getRemoteSocketAddress() 返回

9、远程的IP地址和端口(当且仅当DatagramSocket建立了“连接”,否则返回null)。,DatagramSocket的主要方法,10,DatagramPacket的主要方法,从数据报包中获取相关信息 public InetAddress getAddress() 得到发送或接收到的数据包的IP地址。 public byte getData() 得到发送或接收的数据包的数据缓冲区 public int getLength() 得到发送或接收到的实际数据的长度。 public int getOffset() 得到发送或接收到的数据的偏移量。 public int getPort() 得到发

10、送或接收到的数据包所来自的主机的端口号。,11,设置发送数据包中的相关信息 setAddress(InetAddressiaddr) 设置要将此数据包发往的远程主机的 IP 地址 setPort(intiport) 设置要将此数据包发往的远程主机上的端口号 setData(bytebuf) 为此包设置数据缓冲区。 setData(bytebuf, intoffset, intlength) 为此包设置数据缓冲区,包括偏移量和长度。 setLength(intlength) 为此包设置长度。 见源文件:udp/UDPTest.java,DatagramPacket的主要方法,12,建立Datag

11、ramSocket,创建接收数据的DatagramPacket,等待接收报文,建立DatagramSocket,建立发送数据的DatagramPacket,发出报文,获得对方地址,创建接收包,等待接收,发送端,接收端,UDP协议通信的基本过程,13,数据格式的转换,UDP数据报中只能存放字节类型的数据,如果需要传递其他类型的数据,需要将其他类型的数据与字节类型的数据进行转换。 发送方: ByteArrayOutputStream和DataOutputStream 基本类型数据转换为字节类型 ByteArrayOutputStream和ObjectOutputStream 复合类型数据(对象)转

12、换为字节类型 接收方: ByteArrayInputStream和DataInputStream 字节类型转换为基本类型数据 ByteArrayInputStream和ObjectInputStream 字节类型转换为复合类型数据(对象) 见源文件:TypeChange/BasicTypeChangeSend.java BasicTypeChangeReceive.java,14,选择数据报的大小,DatagramPacket的构造方法中的length参数,决定了要接收和发送的数据报的长度。如果长度不合适,会出现发不出去或数据收不全的情况。 实际上,许多基于UDP的协议(如DNS),都规定数据

13、报的长度不超过512字节。NFS协议(网络文件系统)规定数据报长度不超过8192字节(8KB),对于大于8K的数据报,网络会将数据报截断、分片,或者丢弃。此种情况下,Java程序得不到任何通知。 对于网络可靠性不是很好的情况,选择较小的数据报;对于网络可靠性好的情况,选择尽可能大的数据报,最好不要超过8KB。 注意:一个完整的UDP数据报包括IP头、UDP头和数据三个部分,这里指数据部分。,DatagramSocket选项设置,(1) SO_TIMEOUT void setSoTimeout(int milliseconds) throws SocketException int getSoT

14、imeout() throws SocketException 表示接收数据报时的等待超时时间。设置方法必须在接收数据报前执行才有效,执行receive()方法时,如果超时抛出SocketTimeoutException,但此时DatagramSocket仍然有效,可继续尝试接收数据。 注意:DatagramSocket ds=new DatagramSocket(null); 见源文件:DatagramSocket选项设置/SoTimeoutTest.java,15,DatagramSocket选项设置,(2) SO_RCVBUF void setReceiveBufferSize(int

15、size) throws SocketException int getReceiveBufferSize() throws SocketException 表示底层网络接收数据的缓冲区大小。UDP确保接收数据的缓冲区有足够的大小更为重要,因为缓冲区满后到达的后续数据会被丢弃(TCP会要求重传,确保数据不丢失)。 许多网络都规定了数据报的最大值,如果参数size超过最大值,设置方法将无效。,16,DatagramSocket选项设置,(3) SO_SNDBUF void setSendBufferSize(int size) throws SocketException int getSend

16、BufferSize() throws SocketException 表示底层网络发送数据的缓冲区大小。许多网络都限定了发送数据报缓冲区的最大值,如果参数size超过最大值,设置方法将无效。,17,DatagramSocket选项设置,(4) SO_REUSEADDR void setReuseAddress(boolean on) throws SocketException boolean getReuseAddress() throws SocketException 决定多个DatagramSocket是否可以同时绑定到相同的IP地址和端口(多个进程中的DatagramSocket绑

17、定到同一IP和端口)。如果多个DatagramSocket绑定到相同的IP地址和端口,到达该地址的数据报会复制给所有的DatagramSocket(仅限于广播数据)。,18,DatagramSocket选项设置,(5) SO_BROADCAST void setBroadCast(boolean on) throws SocketException boolean getBroadCast() throws SocketException 是否允许收发广播数据报。 对于一个地址为192.168.5.*,其本地网络广播地址为192.168.5.255。广播数据报一般只在本地网络中传播,路由器和网

18、关一般不转发广播数据报。默认值为true。设置方法在绑定前调用有效。 见源文件:DatagramSocket选项设置/UDPSend1.java UDPRecieve1.java,19,20,组播的基本概念,单播:提供点对点通信。 广播:发送方的数据能够被传播范围内的所有接收者接收。 组播:发送者每次发送的数据可以被小组内的所有接收者接收。介于单播与广播之间。 组播组内的所有主机共享同一个地址。组播地址的范围是从224.0.0.0 到239.255.255.255。,21,组播的基本概念,数据包要达到组播内的任何地址,要求在发送主机和接收主机之间存在一条有多个组播路由器组成的传输路径。音频、视

19、频这类的大容量数据多采用多播形式传递。,22,组播-MulticastSocket,.MulticastSocket具有组播的功能,它是DatagramSocket的子类,与DatagramPacket配合使用来存放接收和发送的组播数据报。 MulticastSocket() throws IOException 此构造方法适合于只向组播组中发送数据的程序 MulticastSocket(int port) throws IOException MulticastSocket(SocketAddress bindAddress) throws IOException 以上两种构造方法适合于接收组播组中发送的数据的程序,23,组播-MulticastSocket,主要方法: (1) 加入到组播组中 void joinGroup(InetAddressmcastaddr) throws IOException void joinGroup(SocketAddressmcastaddr, NetworkInterfacenetIf) throws IOException 第二个方法可以限制MulticastSocket只接收来自某个网络接口的组播数据报。 注意:必须传入合法的IP组播地址。,24

温馨提示

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

最新文档

评论

0/150

提交评论