——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
- DatagramPacket
- DatagramSocket
DatagramSocket 类是用来接受和发送数据包的套接字。使用UDP协议来通信的话要使用IO包中的这两个类。
JDK中的描述
数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
利用UDP协议进行通信的步骤:
客户端发送数据时要指定发送到哪台主机的哪个端口,接收端要指定监听哪个端口,以接收这个传到这个端口的数据。所以步骤一样,但具体实现是有差别的。
- 定义套接字
- 定义好要传输的数据
- 定义好数据包
- 发送数据包
- 关闭套接字
客户端
可以绑定本地任意端口或绑定到一个指定的端口,用此端口进行通信。
创建套接字
- 绑定本地任意端口
DatagramSocket ds new DatagramSocket(); - 绑定到指定的本机端口上
DatagramSocket ds new DatagramSocket(int port);
- 绑定本地任意端口
创建要传输的数据
传送的是字节信息,所以使用byte类型存放要传输的数据。byte[] buf = new byte[1024];
把数据封装进数据包
DatagramPacket(byte[] buf, int length, InetAddress address,int port)
用长度为length的buf数组封装成数据包,发送到address主机的port口上
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
发送数据包
void send(DatagramPacket p);
使用DatagramSocket的send方法发送数据包。
ds.send(dp);
5.关闭套接字
ds.close();
服务端
1. 创建套接字,并监听本地10002端口
DatagramSocket ds = new DatagramSocket(10002);
2. 创建用来存放接收到的数据的字节数组
byte buf[] = new byte[1024];
3. 创建数据报包,
DatagramPacket dp = new DatagramPacket(buf,buf.length);
4. 接受数据,使用DatagramScoket类对象的receive方法接受数据报包,接收到数据报包前一直阻塞。
ds.receive(dp);
5. 提取接收到的数据报包中的内容
byte[] getData() 获取数据报包中的数据
int getLength() 数据报包中数据的长度
InetAddress getAddress() 获取数据包中的IP地址
构造一个字符串,内容为数据包的数据。
String data = new (dp.getData(),0,dp.getLength());
获取发送数据报包的主机地址
String ip = new (dp.getAddress().getHostAddress());
代码小例子:
import java.net.*;
import java.io.*;
class Udp
{
public static void main(String[] args)throws IOException
{
byte[] buf = "Hello Java".getBytes();
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
ds.send(dp);
ds.close();
}
}
class UdpR
{
public static void main(String[] args)throws IOException
{
DatagramSocket ds = new DatagramSocket(10002);
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"..."data);
ds.close();
}
}