Java数据报(UDP)编程

系统 1687 0

一般说明

在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实例.

<!-- ======== NESTED CLASS SUMMARY ======== --><!-- =========== FIELD SUMMARY =========== --><!-- ======== CONSTRUCTOR SUMMARY ======== --> <!-- -->

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 (intport)
Constructs a datagram socket and binds it to the specified port on the local host machine.
DatagramSocket (intport, 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, intlength)
Constructs a DatagramPacket for receiving packets of length length .
DatagramPacket (byte[]buf, intlength, InetAddress address, intport)
Constructs a datagram packet for sending packets of length length to the specified port number on the specified host.
DatagramPacket (byte[]buf, intoffset, intlength)
Constructs a DatagramPacket for receiving packets of length length , specifying an offset into the buffer.
DatagramPacket (byte[]buf, intoffset, intlength, InetAddress address, intport)
Constructs a datagram packet for sending packets of length length with offset ioffset to the specified port number on the specified host.
DatagramPacket (byte[]buf, intoffset, intlength, SocketAddress address)
Constructs a datagram packet for sending packets of length length with offset ioffset to the specified port number on the specified host.
DatagramPacket (byte[]buf, intlength, 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 (intport)
Create a multicast socket and bind it to a specific port.
MulticastSocket ( SocketAddress bindaddr)
Create a MulticastSocket bound to the specified socket address.

基本上,没有指定端口,只为发送,指定端口可收发,多址主机会用套接字地址。

一,DatagramSocket类;DatagramPacket类;InetAddress类

构造函数 public DatagramSocket();
public DatagramSocket(int port);
public DatagramSocket(InetAddress laddr);

close()方法

send(DatagramPacket p)

receive(DatagramPacket p)

接受方的 DatagramPacket public DatagramPacket (byte[]buf, intlength)
发送方的 DatagramPacket public DatagramPacket (byte[]buf, intlength, InetAddressaddress, intport

最简单的UDP程序:

发送程序:UdpSend.java

import java.net. * ;
public class UdpSend
... {
public static void main(String[]args) throws Exception
... {
DatagramSocketds
= new DatagramSocket();
Stringstr
= " helloworld " ;
DatagramPacketdp
= new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName(
" 192.168.0.25 " ), 3000 );
ds.send(dp);
ds.close();
}

}

接收程序:UdpRecv.java

import java.net. * ;
public class UdpRecv
... {
public static void main(String[]args) throws Exception
... {
DatagramSocketds
= new DatagramSocket( 3000 );
byte []buf = new byte [ 1024 ];
DatagramPacketdp
= new DatagramPacket(buf, 1024 );
ds.receive(dp);
StringstrRecv
= new String(dp.getData(), 0 ,dp.getLength()) +
" from " + dp.getAddress().getHostAddress() + " : " + dp.getPort();
System.out.println(strRecv);
ds.close();
}

}

Java数据报(UDP)编程


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论