UDP

简介

UDP数据又称为数据报文datagram,数据报文是独立的、不相关的,对于接受顺序与能否接收到没有保证。通信不是面向连接的协议。 单个的UDP发送接受有两个类:DatapramSocket,DatapramPacket。示意图如下(示意性的真是的packet的数据与端口信息是在ip包中存在的),其中DatagramSocket是UDP的端点(考虑没有客户端与服务器,所以通信两端的类是相同的),DatagramPacket是数,UDP是没有连接的,发送与接受之间没有数据流,如果要发送数据的,端口发送send(packet)函数,说明socket中包含了本地地址与端口号,packet包含远端地址与端口,send函数发送udp数据包,信息有packet的数据内容与两个端点的端口号。receive函数监听本都端口号与ip地址,如果数据到来,可以从中提取通信另一端的ip地址与端口号。

DatapramSocket类介绍

  • 构造函数相关的:构造函数主要处理化本地端口与ip地址,如果不指定本都端口与ip系统采用会还ip地址与空闲端口。也可以指定Socketimp函数,进行底层的实现。 DatagramSocket();DatagramSocket(DatagramSocketImpl impl); DatagramSocket(int port); DatagramSocket(int port, InetAddress laddr); DatagramSocket(SocketAddress bindaddr)
  • void bind(SocketAddress addr)绑定函数,如果datagramsocket没有本地端口与ip地址,绑定一个
  • void connect(InetAddress address,int port); connect(SocketAddress addr)这个函数基本可以不用。因为udp是没有连接的协议,如果使用时,send()、receive函数会直接采用里面的远端ip地址与端口。注意采用了connect函数不能用多播。
  • void disconnect()相对于以上,没有什么应用
  • boolean isBound()状态标识,是否绑定
  • boolean isConnected()是否连接
  • InetAddress getInetAddress();getPort;getLocalSocketAddress;getLocalAddress();getLocalPort获取本地端口号、ip地址相关信息
  • getRemoteSocketAddress()如果设置了connet函数,里面会有远端ip地址,如果没有设置null。
  • void send(DatagramPacket p)发送udp数据包
  • void receive(DatagramPacket p)接受udp数据包,注意正常情况下会是程序block的,时间可以在timoout函数中设置
  • setSoTimeout(int timeout)设置block时间长度单位ms,如果是0表示一直等待
  • int getSoTimeout()返回延时时间
  • setSendBufferSize(int size); getSendBufferSize();setReceiveBufferSize(int size);getReceiveBufferSize为底层设置发送、接受缓存,不一定用到。
  • setReuseAddress(boolean on):getReuseAddress。这个与tcp包的reuseaddress函数不同。好像没有设么意义,oracle的库介绍上说参考多播
  • void setBroadcast(boolean on)设置多播使能
  • boolean getBroadcast()读取多播设置
  • setTrafficClass(int tc); int getTrafficClass()这是ip包的交通状况
  • void close()关闭socket,如果有进程block,抛出异常
  • boolean isClosed()是否关闭
  • boolean isClosed()返回通道
  • void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)设置一些优化参数。

PacketSocket类接受

PacketSocket主要用于数据的发送与接受,主要要指定缓存大小,对于发送Packetsocket数据包需要指定远端ip地址与数据包。函数如下:

  • 构造函数: 1、DatagramPacket(byte[] buf, int length); 2、DatagramPacket(byte[] buf, int offset, int length); 3、DatagramPacket(byte[] buf, int length, InetAddress address, int port) 4、DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 5、DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 6、DatagramPacket(byte[] buf, int length, SocketAddress address) 前两个用于接受端的packet处理化。后面的用于发动端的厨师化。

  • InetAddress getAddress();int getPort();SocketAddress getSocketAddress()获取packet包中的ip地址,发送包与接受包都可以

  • byte[] getData();int getOffset();int getLength();设置数据相关信息

  • void setAddress(InetAddress iaddr);void setPort(int iport);void setSocketAddress(SocketAddress address)设置socket相关信息

  • setData(byte[] buf);void setData(byte[] buf, int offset, int length);setLength(int length)设置数据

udp单个数据包的发送与接受流程。

发送端:

  1. 用socketAddress初始化DatagramSocket。
  2. 用一个缓存(要发送的数据包)与SocketAddress(远端ip地址与端口号)初始化PacketSocket包。
  3. 调用send函数发送
  4. 关闭函数,也可以直接用用try resource处理

接受端 发送端:

  1. 用socketAddress初始化DatagramSocket。
  2. 用一个空的缓存与SocketAddress(远端ip地址与端口号)初始化PacketSocket包。
  3. 调用receive函数接受,并进入block
  4. 其他处理。
  5. 关闭函数,也可以直接用用try resource处理

参考:

  • 主要参考为oracle的tutorial
  • 库文件说明
  • 在学习的过程中看过一些博客,参考部分很少

转载于:https://juejin.im/post/5cf4d6ed6fb9a07ede0b2df6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值