发送端
/**
* 发送端
*/
// 1、创建发送端对象:发送端自带默认的端口号(人),port可以指定,也可以不指定
DatagramSocket socket = new DatagramSocket(6666);
// 2、创建一个数据包对象封装数据(韭菜盘子)
/**
* @param buf the packet data.封装要发送的数据
* @param length the packet data length.发送数据的大小
* @param address the destination address.接受端的IP地址
* @param port the destination port number.接受端的端口号
*/
byte[] buffer = "封装要发送的数据".getBytes();
InetAddress ip = InetAddress.getLocalHost();
int port = 8888;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, ip,port);
// 3、发送数据出去
socket.send(packet);
接受端
/**
* 接受端
*/
System.out.println("=====接受端启动=====");
// 1、创建接受端对象,注册端口(人)
int port = 8888;
DatagramSocket socket = new DatagramSocket(port);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024*64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
// 3、等待接受数据即可
socket.receive(packet);
// 4、取出数据即可
String rs = new String(buffer);
int len = packet.getLength();
// 发多少,接受多少
String rs = new String(buffer,0,len);
System.out.println("rs = " + rs);
// 5.获取发送端的IP和端口
String ip = packet.getAddress().toString();
int port1 = packet.getPort();
System.out.println("发送端IP:"+ip);
System.out.println("发送端端口:"+port1);
socket.close();//关闭资源
循环接受循环发送
/**
* 发送端
*/
// 1、创建发送端对象:发送端自带默认的端口号(人),port可以指定,也可以不指定
DatagramSocket socket = new DatagramSocket(6666);
// 2、创建一个数据包对象封装数据(韭菜盘子)
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();//输入
if ("exit".equals(msg)) {
System.out.println("离线成功");
socket.close();//释放资源
break;
}
byte[] buffer = msg.getBytes();
InetAddress ip = InetAddress.getLocalHost();
int port = 8888;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, ip, port);
// 3、发送数据出去
socket.send(packet);
}
/**
* 接受端
*/
System.out.println("=====接受端启动,循环接受=====");
// 1、创建接受端对象,注册端口(人)
int port = 8888;
DatagramSocket socket = new DatagramSocket(port);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024*64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
// 3、等待接受数据即可
socket.receive(packet);
// 4、取出数据即可
byte[] data = packet.getData();
int len = packet.getLength();
// 发多少,接受多少
String rs = new String(data,0,len);
// 5.获取发送端的IP和端口
String ip = packet.getAddress().toString();
int port1 = packet.getPort();
System.out.println("发送端IP:"+ip);
System.out.println("发送端端口:"+port1);
System.out.println("消息内容:"+rs);
}
UDP如何实现广播
使用广播地址:255.255.255.255
具体操作:
- 发送端发送的数据的目的地写的是广播地址,且指定端口。(2555.255.255.255,9999)
- 本机所在的网段的其他主机的程序只要匹配端口成功,就可以收到消息了,(9999)
- 接受端要使用同一个端口号,比如9999 ```java /**
- 发送端 */
// 1、创建发送端对象:发送端自带默认的端口号(人),port可以指定,也可以不指定 DatagramSocket socket = new DatagramSocket(6666);
// 2、创建一个数据包对象封装数据(韭菜盘子)
Scanner sc = new Scanner(System.in); while (true) { System.out.println(“请说:”); String msg = sc.nextLine();//输入 if (“exit”.equals(msg)) { System.out.println(“离线成功”); socket.close();//释放资源 break; } byte[] buffer = msg.getBytes(); //定义广播地址 InetAddress ip = InetAddress.getByName(“255.255.255.255”); int port = 9999; DatagramPacket packet = new DatagramPacket(buffer, buffer.length, ip, port);
// 3、发送数据出去 socket.send(packet); }
```java
/**
* 接受端
*/
System.out.println("=====接受端启动,循环接受=====");
// 1、创建接受端对象,注册端口(人)
int port = 9999;
DatagramSocket socket = new DatagramSocket(port);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024*64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
// 3、等待接受数据即可
socket.receive(packet);
// 4、取出数据即可
byte[] data = packet.getData();
int len = packet.getLength();
// 发多少,接受多少
String rs = new String(data,0,len);
// 5.获取发送端的IP和端口
String ip = packet.getAddress().toString();
int port1 = packet.getPort();
System.out.println("发送端IP:"+ip);
System.out.println("发送端端口:"+port1);
System.out.println("消息内容:"+rs);
}
UDP如何实现组播
使用组播地址:224.0.0.0~239.255.255.255
具体操作:
- 发送端的数据包的目的地是组播IP(例如:224.0.1.1,端口:9999)
- 接收端必须绑定该组播IP(224.0.1.1),端口还要对应发送端的目的端口9999,这样即可接受该组播消息。
DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP
/**
* 发送端
*/
// 1、创建发送端对象:发送端自带默认的端口号(人),port可以指定,也可以不指定
DatagramSocket socket = new DatagramSocket(6666);
// 2、创建一个数据包对象封装数据(韭菜盘子)
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();//输入
if ("exit".equals(msg)) {
System.out.println("离线成功");
socket.close();//释放资源
break;
}
byte[] buffer = msg.getBytes();
//定义组播地址
InetAddress ip = InetAddress.getByName("224.0.1.1");
int port = 9999;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, ip, port);
// 3、发送数据出去
socket.send(packet);
}
/**
* 接受端
*/
System.out.println("=====接受端启动,循环接受=====");
// 1、创建接受端对象,注册端口(人)
int port = 9999;
MulticastSocket socket = new MulticastSocket(port);
//绑定组播地址(JDK14以后就过时了)
InetAddress ip1 = InetAddress.getByName("224.0.1.1");
socket.joinGroup(ip1);
//绑定组播地址(不过时的)
// InetSocketAddress ip2 = new InetSocketAddress(InetAddress.getByName("224.0.1.1"),9999);
// NetworkInterface localIP = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
// socket.joinGroup(ip2,localIP);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
// 3、等待接受数据即可
socket.receive(packet);
// 4、取出数据即可
byte[] data = packet.getData();
int len = packet.getLength();
// 发多少,接受多少
String rs = new String(data, 0, len);
// 5.获取发送端的IP和端口
String ip = packet.getAddress().toString();
int port1 = packet.getPort();
System.out.println("发送端IP:" + ip);
System.out.println("发送端端口:" + port1);
System.out.println("消息内容:" + rs);
}