一般说明
在tcp/ip协议族中,udp和tcp同样位于传输层,用户数据报是udp协议中的概念.
udp协议提供面向事务的简单不可靠信息传送服务,它不提供对 ip 协议的可靠机制、流控制以及错误恢复功能.
udp 协议基本上是ip 协议与上层协议的接口,从整个用户数据在各层的包装看,udp报文格式相当简单:
16 | 32bit |
source port源端口 | destination port目标端口 |
length 报文长度(单位是字节,包括首部和用户数据区) | checksum(校验和) |
data |
由于校验和的原因,udp还引入了伪首部,这导致了udp和ip层的关系过于密切,破坏了分层原则.
java数据报支持
包java.net中提供了两个类datagramsocket和datagrampacket用来支持数据报通信,datagramsocket用于在程序之间建立传送数据报的通信连接, datagrampacket则用来表示一个数据报。
datagramsocket代表发送和接收数据报的套接字,一个数据报套接字是为包递送服务的发送和接收点,在一个数据报套接字上,每个被发送和接收的包都被独立的寻址和路由,从一台机器到另一台机器上发送的多个包有不同的路由,任意的抵达顺序.
对于datagramsocket,udp广播发送总是使能的(那是缺省设置).为了接收广播包这个类实例应该绑定到通用地址(wildcard address).在某些实现中,当被绑定到更多特定地址上的时候广播包也可以接收.
例如:
datagramsocket s = new datagramsocket(null);
s.bind(new inetsocketaddress(8888));
这等同于:
datagramsocket s = new datagramsocket(8888);
两种情况都会创建一个能在端口8888上接收广播的datagramsocket实例.
constructor summary | |
datagramsocket() constructs a datagram socket and binds it to any available port on the local host machine. |
|
protected | datagramsocket(datagramsocketimpl impl) creates an unbound datagram socket with the specified datagramsocketimpl. |
datagramsocket(int port) constructs a datagram socket and binds it to the specified port on the local host machine. |
|
datagramsocket(int port, inetaddress laddr) creates a datagram socket, bound to the specified local address. |
|
datagramsocket(socketaddress bindaddr) creates a datagram socket, bound to the specified local socket address. |
其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成socketexception类例外。
用数据报方式编写通信程序时,通信双方,首先都要建立一个datagramsocket对象,用来接收或发送数据报,然后使用datagrampacket类对象作为传输数据的载体。下面看一下datagrampacket的构造方法 :
constructor summary | |
datagrampacket(byte[] buf, int length) constructs a datagrampacket for receiving packets of length length. |
|
datagrampacket(byte[] buf, int length, inetaddress address, int port) constructs a datagram packet for sending packets of length length to the specified port number on the specified host. |
|
datagrampacket(byte[] buf, int offset, int length) constructs a datagrampacket for receiving packets of length length, specifying an offset into the buffer. |
|
datagrampacket(byte[] buf, int offset, int length, inetaddress address, int port) constructs a datagram packet for sending packets of length length with offset ioffsetto the specified port number on the specified host. |
|
datagrampacket(byte[] buf, int offset, int length, socketaddress address) constructs a datagram packet for sending packets of length length with offset ioffsetto the specified port number on the specified host. |
|
datagrampacket(byte[] buf, int length, socketaddress address) constructs a datagram packet for sending packets of length length to the specified port number on the specified host. |
可以看出,有两个供接收的构造器和四个供发送的构造器.其中,buf中存放数据报数据,length为数据报中数据的长度,address和port旨明目的地址,offset指明了数据报的位移量。
java组播支持
multicastsocket 多播数据报套接字。这个组播套接字对于收发ip多播数据包是很有用的,它扩展了datagramsocket,在其上附加了加入internet上多播组的方法。一个多播组由d类ip地址和标准udp端口指定,d类ip范围是224.0.0.0 to 239.255.255.255,其中224.0.0.0被保留不为它用。
它有三个构造器:
constructor summary | |
multicastsocket() create a multicast socket. |
|
multicastsocket(int port) create a multicast socket and bind it to a specific port. |
|
multicastsocket(socketaddress bindaddr) create a multicastsocket bound to the specified socket address. |
基本上,没有指定端口,只为发送,指定端口可收发,多址主机会用套接字地址。