2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)
一、快速入门
DatagramPacket:数据包对象
实例代码
定义发送端
package com.zcl.d8_udp1;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
发送端 一发一收
*/
public class ClientDemo {
public static void main(String[] args) throws Exception {
System.out.println("-------客户务端--------");
// 创建发送端对象:发送端自带的端口号
DatagramSocket socket = new DatagramSocket();
// 2、创建一个数据包对象封装数据
/**
* 参数一:封装要发送的数据
* 参数二:发送数据的大下
* 参数三:服务器IP地址
* 参数四:服务的的端口
*/
byte[] buffer = "iu覆盖哈怂分红四".getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8881);
// 发送数据出去
socket.send(packet);
// 释放资源
socket.close();
}
}
定义服务端接收
package com.zcl.d8_udp1;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
接收端
*/
public class ServerDemo2 {
public static void main(String[] args) throws Exception {
System.out.println("-------启动服务端--------");
// 1、创建接收端对象,注册端口
DatagramSocket socket = new DatagramSocket(8881);
// 2、创建一个数据包对象接收数据
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
// 3、等待接收数据
socket.receive(packet);
// 4、取出数据
// 读取多少取多少
int len = packet.getLength();
String rs = new String(buffer,0,len);
System.out.println("收到数据:"+rs);
// 获取发送端的ip和端口
String ip = packet.getSocketAddress().toString();
System.out.println("发送端的地址:"+ip);
int port = packet.getPort();
System.out.println("对方端口:"+port);
/*
-------启动服务端--------
收到数据:iu覆盖哈怂分红四
*/
// 释放资源
socket.close();
}
}
关于启动:先启动服务的再启动发送端,返回服务端的输出就可以看到打印出来接收的数据==
二、使用UDP实现多发和多收
实例代码
package com.zcl.d9_udp2;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
发送端 多发多收
*/
public class ClientDemo {
public static void main(String[] args) throws Exception {
System.out.println("-------客户务端--------");
// 创建发送端对象:发送端自带的端口号
DatagramSocket socket = new DatagramSocket();
// 2、创建一个数据包对象封装数据
/**
* 参数一:封装要发送的数据
* 参数二:发送数据的大下
* 参数三:服务器IP地址
* 参数四:服务的的端口
*/
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入需要发送的信息:");
String msg = sc.nextLine();
byte[] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8881);
//退出判断
if("exit".equals(msg)){
System.out.println("离线成功");
socket.close(); // 释放资源
break;
}
// 发送数据出去
socket.send(packet);
}
}
}
实例代码
package com.zcl.d9_udp2;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
接收端
*/
public class ServerDemo2 {
public static void main(String[] args) throws Exception {
System.out.println("-------启动服务端--------");
// 1、创建接收端对象,注册端口
DatagramSocket socket = new DatagramSocket(8881);
// 2、创建一个数据包对象接收数据
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
// 3、等待接收数据
socket.receive(packet);
// 4、取出数据
// 读取多少取多少
int len = packet.getLength();
String rs = new String(buffer,0,len);
System.out.println("接收到了来自:"+packet.getSocketAddress().toString()+",端口号为:"+packet.getPort()+"的信息:"+rs);
}
}
}
三、广播和组播
UDP如何实现广播
使用广播地址:255.255.255.255
具体操作:
① 发送端发送的数据包的目的地写的是广播地址、且指定端口。(255.255.255.255, 9999)
② 本机所在网段的其他主机的程序只要匹配端口成功即就可以收到消息了。(9999)
UDP如何实现组播
使用组播地址:224.0.0.0~239.255.255.255
具体操作:
① 发送端的数据包的目的地是组播IP(例如:224.0.1.1,端口:9999)
② 接收端必须绑定该组播IP(224.0.1.1),端口还要对应发送端的目的端口9999,这样即可接收该组播消息。
③DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。