简介
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单个数据包的发送与接受流程。
发送端:
- 用socketAddress初始化DatagramSocket。
- 用一个缓存(要发送的数据包)与SocketAddress(远端ip地址与端口号)初始化PacketSocket包。
- 调用send函数发送
- 关闭函数,也可以直接用用try resource处理
接受端 发送端:
- 用socketAddress初始化DatagramSocket。
- 用一个空的缓存与SocketAddress(远端ip地址与端口号)初始化PacketSocket包。
- 调用receive函数接受,并进入block
- 其他处理。
- 关闭函数,也可以直接用用try resource处理
参考:
- 主要参考为oracle的tutorial
- 库文件说明
- 在学习的过程中看过一些博客,参考部分很少