基于UDP协议的Socket通信.ppt

上传人:牧羊曲112 文档编号:6042970 上传时间:2023-09-17 格式:PPT 页数:25 大小:338.50KB
返回 下载 相关 举报
基于UDP协议的Socket通信.ppt_第1页
第1页 / 共25页
基于UDP协议的Socket通信.ppt_第2页
第2页 / 共25页
基于UDP协议的Socket通信.ppt_第3页
第3页 / 共25页
基于UDP协议的Socket通信.ppt_第4页
第4页 / 共25页
基于UDP协议的Socket通信.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《基于UDP协议的Socket通信.ppt》由会员分享,可在线阅读,更多相关《基于UDP协议的Socket通信.ppt(25页珍藏版)》请在三一办公上搜索。

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协议实现网络通信的类有三个:DatagramSocketDatagramPacketMulticastSocket,UDP协议-数据报通信,邮局A,包裹A,包裹B,包裹C,邮局D,邮局B,邮局C,5,DatagramSocket,public DatagramSocket()创建

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

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

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

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

7、calAddress()获取套接字绑定的本地地址。SocketAddress getLocalSocketAddress()返回SocketAddress对象,它包含DatagramSocket所绑定的IP地址和端口。void connect(InetAddress host,int port)限制当前DatagramSocket只对参数指定的远程主机和端口收发数据报。如果对其他DatagramSocket发送数据,send()方法抛出IllegalArgumentException。接收到的数据报会抛弃,程序不会得到通知,也不会抛出异常。,DatagramSocket的主要方法,9,void

8、 disconnect()解除当前DatagramSocket与特定主机建立的“连接”,以后可对其他任何DatagramSocket收发数据报。int getPort()返回远程的端口(当且仅当DatagramSocket建立了“连接”,否则返回-1)。InetAddress getInetAddress()返回远程的IP地址(当且仅当DatagramSocket建立了“连接”,否则返回null)。SocketAddress getRemoteSocketAddress()返回远程的IP地址和端口(当且仅当DatagramSocket建立了“连接”,否则返回null)。,DatagramSoc

9、ket的主要方法,10,DatagramPacket的主要方法,从数据报包中获取相关信息 public InetAddress getAddress()得到发送或接收到的数据包的IP地址。public byte getData()得到发送或接收的数据包的数据缓冲区 public int getLength()得到发送或接收到的实际数据的长度。public int getOffset()得到发送或接收到的数据的偏移量。public int getPort()得到发送或接收到的数据包所来自的主机的端口号。,11,设置发送数据包中的相关信息 setAddress(InetAddressiaddr)设

10、置要将此数据包发往的远程主机的 IP 地址 setPort(intiport)设置要将此数据包发往的远程主机上的端口号 setData(bytebuf)为此包设置数据缓冲区。setData(bytebuf,intoffset,intlength)为此包设置数据缓冲区,包括偏移量和长度。setLength(intlength)为此包设置长度。见源文件:udp/UDPTest.java,DatagramPacket的主要方法,12,建立DatagramSocket,创建接收数据的DatagramPacket,等待接收报文,建立DatagramSocket,建立发送数据的DatagramPacket

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

12、和ObjectInputStream字节类型转换为复合类型数据(对象)见源文件:TypeChange/BasicTypeChangeSend.java BasicTypeChangeReceive.java,14,选择数据报的大小,DatagramPacket的构造方法中的length参数,决定了要接收和发送的数据报的长度。如果长度不合适,会出现发不出去或数据收不全的情况。实际上,许多基于UDP的协议(如DNS),都规定数据报的长度不超过512字节。NFS协议(网络文件系统)规定数据报长度不超过8192字节(8KB),对于大于8K的数据报,网络会将数据报截断、分片,或者丢弃。此种情况下,Jav

13、a程序得不到任何通知。对于网络可靠性不是很好的情况,选择较小的数据报;对于网络可靠性好的情况,选择尽可能大的数据报,最好不要超过8KB。注意:一个完整的UDP数据报包括IP头、UDP头和数据三个部分,这里指数据部分。,DatagramSocket选项设置,(1)SO_TIMEOUTvoid setSoTimeout(int milliseconds)throws SocketExceptionint getSoTimeout()throws SocketException 表示接收数据报时的等待超时时间。设置方法必须在接收数据报前执行才有效,执行receive()方法时,如果超时抛出Socke

14、tTimeoutException,但此时DatagramSocket仍然有效,可继续尝试接收数据。注意:DatagramSocket ds=new DatagramSocket(null);见源文件:DatagramSocket选项设置/SoTimeoutTest.java,15,DatagramSocket选项设置,(2)SO_RCVBUF void setReceiveBufferSize(int size)throws SocketExceptionint getReceiveBufferSize()throws SocketException表示底层网络接收数据的缓冲区大小。UDP确

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

16、amSocket选项设置,(4)SO_REUSEADDR void setReuseAddress(boolean on)throws SocketExceptionboolean getReuseAddress()throws SocketException 决定多个DatagramSocket是否可以同时绑定到相同的IP地址和端口(多个进程中的DatagramSocket绑定到同一IP和端口)。如果多个DatagramSocket绑定到相同的IP地址和端口,到达该地址的数据报会复制给所有的DatagramSocket(仅限于广播数据)。,18,DatagramSocket选项设置,(5)S

17、O_BROADCAST void setBroadCast(boolean on)throws SocketException boolean getBroadCast()throws SocketException 是否允许收发广播数据报。对于一个地址为192.168.5.*,其本地网络广播地址为。广播数据报一般只在本地网络中传播,路由器和网关一般不转发广播数据报。默认值为true。设置方法在绑定前调用有效。见源文件:DatagramSocket选项设置/UDPSend1.java UDPRecieve1.java,19,20,组播的基本概念,单播:提供点对点通信。广播:发送方的数据能够被传

18、播范围内的所有接收者接收。组播:发送者每次发送的数据可以被小组内的所有接收者接收。介于单播与广播之间。组播组内的所有主机共享同一个地址。组播地址的范围是从224.0.0.0 到。,21,组播的基本概念,数据包要达到组播内的任何地址,要求在发送主机和接收主机之间存在一条有多个组播路由器组成的传输路径。音频、视频这类的大容量数据多采用多播形式传递。,22,组播-MulticastSocket,具有组播的功能,它是DatagramSocket的子类,与DatagramPacket配合使用来存放接收和发送的组播数据报。MulticastSocket()throws IOException 此构造方法适

19、合于只向组播组中发送数据的程序 MulticastSocket(int port)throws IOException MulticastSocket(SocketAddress bindAddress)throws IOException 以上两种构造方法适合于接收组播组中发送的数据的程序,23,组播-MulticastSocket,主要方法:(1)加入到组播组中void joinGroup(InetAddressmcastaddr)throws IOExceptionvoid joinGroup(SocketAddressmcastaddr,NetworkInterfacenetIf)th

20、rows IOException 第二个方法可以限制MulticastSocket只接收来自某个网络接口的组播数据报。注意:必须传入合法的IP组播地址。,24,组播-MulticastSocket,(2)离开组播组void leaveGroup(InetAddressmcastaddr)throws IOExceptionvoid leaveGroup(SocketAddressmcastaddr,NetworkInterfacenetIf)throws IOException MulticastSocket有可能一开始就加入了所有网络接口的组播组,可通过此方法离开其中的一个网络接口中的组播组

21、。注意:如果离开的地址不是组播地址会抛出IOException,如果离开一个从未加入的组播组,不会抛出任何异常。,25,组播-MulticastSocket,(3)设置和读取TTL(Time to Live)属性 void setTimeToLive(intttl)throws IOException int getTimeToLive()throws IOException 取值范围0-255(4)设置和读取组播数据报的回送模式 void setLoopbackMode(boolean disable)throws SocketException boolean getLoopbackMode()throws SocketException 注意:MulticastSocket是否能够收到自己发送的组播数据报,与底层实际网络情况决定。见源文件:组播/MulticastSender.java MulticaseReciever.java,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号