UDP是在IP上发送数据的另一种协议。不可靠,无法知道数据是否到达,也无法知道数据的不同
部分是否已发送时的数据到达。
UDP为什么有使用之地:在实时音频或视频中丢失或交换数据包只会出现噪声。噪声是可以容忍
的。但是不可容忍停顿,
UDP的实现分为两个类:DatagramPacket(将数据字节填充到数据报的UDP包中)和
DatagramSocket(可以收发UDP数据报)。
与TCP的ServerSocket和Socket不同之处:1.UDP没有两台主机间唯一连接的概念,一个DatagramSocket可以从多个独立主机收发数据。此
处的socket并不专注于一个连接。
2.TCP将网络视为流,通过socket获取输入输出流来收发数据,UDP以数据包形式发送
DatagramPacketUDP数据报基于IP建立的,每台主机有65536个端口号可以使用。数据报中字节数限制为65536-8
个字节(首部要用8个字节)
构造函数:
public DatagramPacket(byte[] buffer,int length)
public DatagramPacket(byte[] buffer,int offset,int length)
如果试图构造一个长度超过buffer的DatagramPacket,将抛出IllegalArgumentException
可以在数据报发送之后并且发送之前修改数据报的data.
getInetAddress():返回一个包含远程主机地址的InetAddress对象。如果数据报是internet接
收的,返回的地址是发送机器的地址。如果是客户端,则返回的是寻址地址。
getPort():返回远程端口
SocketAddress getSocketAddress():返回一个包含远程主机和端口的SocketAddress对象。
byte[] getData():返回一个字节数组,其中包含数据报中的数据
getLength():返回数据报中数据的字节数。它与getData()返回的数组长度不一定相等,
getLength()返回的值可能小于getData()返回的数组长度。
setData(byte[] data):
setData(byte[] data,int offset,int length)
setLength(int length):会改变内部缓冲区中包含实际数据报数据的字节数,而不包含未填充数据的空间。
DatagramSocket:
构造函数:DatagramSocket()
构造函数:DatagramSocket(int port):如果无法创建socket,则抛出SocketException(原因为:指定的端口已被占用或者低于1024的端口没有特权 )
TCP端口和UDP端口没有关联,TCP和UDP可以使用相同的端口号
for(int port=1024;port<=65535;port++)
{
try
{
DatagramSocket server=new DatagramSocket(port);
server.close();
}
catch (SocketException e)
{
System.out.println("There is a server on port:"+port);
}
}
DatagramSocket(int port,InetAddress interface)
DatagramSocket(SocketAddress interface)
void receive(DatagramPacket dp)throws IOException
:与ServerSocket的accept方法类似,此方法会阻塞调用线程,直到数据报到达。如果程序除了等待数据报外还有其他操作,就应当在单独的线程中调用receive()。
void connect(InetAddress host,int port):
connect方法实际上不建立TCP意义上的连接。它确实知名DatagramSocket只对远程主机和指定远程端口发包。试图向另外的主机或端口发包将抛出IllegalArgumentException异常
disconnect():中止已连接DatagramSocket的"连接",这样可以再次收发任何主机和端口的包。
setSoTimeout(int timeout):默认0永不超时
void setReceiveBufferSize(int size)throws SocketException:
建议对来自此socket的输入进行缓冲时使用的字符字节数,但是底层完全可以忽略此建议。