在Java语言中的DategramPacket类用来创建UDP数据报

在Java语言中的DategramPacket类用来创建UDP数据报

数据报按用途可分为两种:
一种用来发送数据,该数据报要有传递的目的地址和端口号;另一种数据报用来从网络中接收数据。
创建接收数据报的构建器有:

      public DatagramPacket(byte[] buf, int length)
      public DatagramPacket(byte[] buf, int offset, int length)
例:
 byte[ ] buffer=new byte[8912];
 DatagramPacket datap=new DatagramPacket(buffer ,buffer.length( ));
 在UDP报文中,数据报长度用2个字节的无符号整数表示,
所以理论上UDP报文的最大长度为65536字节(包含UDP头部以及IP头部)。
但是实际上,大多数系统限制了数据报的长度为8192字节。
在具体的网络环境中,这个限制可能更小。

创建发送数据报的构建器有:
public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
public DatagramPacket(byte[] buf, int offset, int length,
InetAddress address, int port)
其中缓冲区buf为发送数据存储区,offset和length意义同上。address和port指定目标服务器的IP地址和端口号。例如:
try {
    InetAddress server = InetAddress.getByName("10.40.48.134");
    int port = 37;
    byte[] data = "This is a test".getBytes();
    DatagramPacket outgoing
      = new DatagramPacket(data, data.length, server, port);
    ...
}catch(IOException e){
    ...
}

DatagramPacket对象有下列几个常用的重要方法,用来对数据报进行设置或者从中提取信息。
public InetAddress getAddress() 返回一个IP地址,发送数据报指目标主机,接收数据报指源主机。
总之对通信的一端来说,指对端的IP地址。
public void setAddress(InetAddress remote) 设置发送数据报的目标主机的IP地址。
public int getPort() 返回一个端口号,发送数据报指目标主机的端口号,
接收数据报指来自源主机的端口号。
public void setPort(int iport) 设置发送数据报的目标服务器的端口号。
public byte []getData() 获得数据报的数据缓冲区,不论是发送数据报还是接收数据报,
数据存储从offset位置开始。
public int getOffset() 获得发送数据或者接收数据在数据缓冲区中的偏移量(offset)。
public int getLength() 获得发送数据或者接收数据的长度。
public void setData(byte[] buf, int offset, int length) 设置数据缓冲区、偏移量和长度。
还可以使用方法setData(byte[] buf) 和setLength(int length)单独设置缓冲区和长度。


发送或者接收UDP数据报,首先需要创建数据报套接字。在Java语言里,数据报套接字由类java.net. DatagramSocket实现。
在TCP程序设计中,我们使用Socket创建一个客户端套接字,使用ServerSocket创建一个服务器套接字;但在Java的UDP应用中,并不存在DatagramServerSocket这个类,DatagramSocket既可用于UDP客户端也可用于UDP服务器。
和Socket一样,DatagramSocket也实现了双向通信,DatagramSocket既可用来发送DatagramPacket也可以用来接送DatagramPacket。
DatagramSocket的构造方法有:
      public DatagramSocket() throws SocketException
      public DatagramSocket(int port) throws SocketException
      public DatagramSocket(int port, InetAddress laddr) throws SocketException
      其中port明确指定DatagramSocket绑定的端口,如果不指定port,系统自动为数据报套接字选择一个可用端口。


public void send(DatagramPacket p) throws IOException 从当前数据报套接字发送一个数据报。发送数据报应包含数据、数据长度和目标主机IP地址、端口号等信息。
public void receive(DatagramPacket p) throws IOException从当前数据报套接字接收一个数据报。接收数据报应包含数据、数据长度和发送主机IP地址、端口号等信息。
public void close() 关闭数据报套接字,释放其占有的系统资源。
需要注意的是调用receive()方法,将阻塞当前Java线程,直到其能收到数据报才返回。此前,我们可以调用方法setSoTimeout()设置等待时间,当等待时间到,receive()方法返回并抛出异常SocketTimeoutException。调用close() 关闭数据报套接字时,被阻塞的receive()调用也会因IOException异常而返回。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值