目录
1.【UDP通信】
1.1【UDP发送数据】
【构造方法】:
DatagramSocket():构造一个数据报套接字并将其绑定到本地主机上的任何可用端口。
DatagramPacket(byte[] buf, int length, InetAddress address, int port):创建一个数据包,发送长度为length的数据包到指定主机上的指定端口号
【成员方法】:
void send(DatagramPacket p):从此套接字发送数据包
void close():关闭此数据套接字
【步骤】:
- 创建发送端的DatagramSocket对象
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
例:
DatagramSocket ds=new DatagramSocket();
String s="送的礼物";
byte[] bytes=s.getBytes();
InetAddress address=InetAddress.getByName("127.0.0.1");
int port=10000;
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,address,port);
ds.send(dp);
ds.close();
1.2【UDP接收数据】
【构造方法】:
DatagramSocket(int port):构造一个数据报套接字并将其绑定到本地主机上的指定端口。
DatagramPacket(byte[] buf, int length):构造一个DatagramPacket用于接收长度为length的数据包
【DatagramSocket成员方法】:
void receive(DatagramPacket p):从此套接字接收数据包
void close():关闭此数据套接字
【DatagramPacket成员方法】:
byte[ ] getData():返回数据缓冲区
int getLength():返回要发送的数据的长度或要接收的数据的长度
【步骤】:
- 创建接收端的DatagramSocket对象
- 创建一个箱子,用于接收数据
- 调用DatagramSocket的方法接收数据并将数据放入箱子中
- 解析数据包,并把数据在控制台显示
- 释放资源
例:
DatagramSocket ds=new DatagramSocket(10000);
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//byte[] data=dp.getData();
int length = dp.getLength();
System.out.println(new String(bytes,0,length));
ds.close();
1.3【UDP通信——示例项目】
简易的聊天室
//发送端
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
while (true) {
String s = sc.next();
if ("886".equals(s)) {
break;
}
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
ds.send(dp);
}
ds.close();
}
//接收端
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10000);
while (true){
byte[]bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(bytes,0,length));
}
2.【UDP的三种通信方式】
2.1【单播】
同【UDP通信】
2.2【组播】
2.2.1【组播地址】
224.0.0.0 ~ 239.255.255.255(其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址,不能使用)
2.2.2【发送端】
【步骤】:
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
【注意】:
在组播中第三步发送数据,是发给组播地址
例:
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
String s = "组播Hello";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
InetAddress address = InetAddress.getByName("224.0.1.0");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
ds.send(dp);
ds.close();
}
2.2.3【接收端】
【步骤】:
- 创建接收端的Socket对象(MulticastSocket)
- 创建一个箱子,用于接收数据
- 把当前电脑添加到这个组中(joinGroup方法)
- 调用DatagramSocket的方法接收数据并将数据放入箱子中
- 解析数据包,并把数据在控制台显示
- 释放资源
例:
public static void main(String[] args) throws IOException {
MulticastSocket ms=new MulticastSocket(10000);
DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
//把当前计算机绑定一个组播地址,表示添加到这一组中
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
ms.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
ms.close();
}
2.3【广播】
2.3.1【组播地址】
255.255.255.255
2.3.2【发送端】
【步骤】:
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
【注意】:
在广播中第三步发送数据,是发给广播地址
例:
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
String s = "广播Hello";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
ds.send(dp);
ds.close();
}
2.3.3【接收端】
【步骤】:
- 创建接收端的DatagramSocket对象
- 创建一个箱子,用于接收数据
- 调用DatagramSocket的方法接收数据并将数据放入箱子中
- 解析数据包,并把数据在控制台显示
- 释放资源
例:
public static void main(String[] args) throws IOException {
MulticastSocket ms=new MulticastSocket(10000);
DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
ms.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
ms.close();
}