上一篇文章我们讲了UDP通信实现一发一收,本篇的多发多收就是在上篇文章的基础之上实现的。
上篇文章戳这里☞:UDP通信实现一发一收
首先,我们来改造一下客户端
我们让发消息的代码进入一个死循环
选中这一段内容,按Ctrl+Alt+T选择while,使其进入一个死循环
byte[] bytes = "我是一个客户端,ABC123adc234".getBytes(); int length = bytes.length; InetAddress address = InetAddress.getLocalHost(); DatagramPacket packet = new DatagramPacket(bytes,length,address,6666);socket.send(packet);
由于死循环不会结束,下面的代码无法执行就会报错,我们先把下面的两行代码删除
System.out.println("客户端数据发送完毕~~"); socket.close(); // 释放资源
此时,每次都是发送固定的数据,不具有实用性,我们可以对代码进行改造
1、使用Scanner来输入自己想要发送的数据
2、定义String变量来接收输入的数据
3、定义字节数组来保存
4、添加一个判断语句,让用户可以退出
while (true) { System.out.println("请输入内容(输入exit退出输入):"); String msg = sc.nextLine(); byte[] bytes = msg.getBytes(); //退出输入 if(msg.equals("exit")){ System.out.println("退出输入成功"); socket.close(); break; } int length = bytes.length; InetAddress address = InetAddress.getLocalHost(); DatagramPacket packet = new DatagramPacket(bytes,length,address,6666); //3.开始正式发送这个数据包的数据出去了 socket.send(packet); }
到这里,客户端的改造基本完成,然后对服务端进行改造
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
多发多收
*/
public class Client {
public static void main(String[] args) throws Exception{
//1.创建客户端对象(发韭菜出去的人)
DatagramSocket socket = new DatagramSocket();
//2.创建数据包对象封装要发出去的数据(创建一个韭菜盘子)
// public DatagramPacket(byte buf[], int length,
// InetAddress address, int port)
/*
参数一:封装要发出去的数据,转成字节数组
参数二:发送出去的数据大小(字节个数)
参数三:服务端的IP地址(找到服务端主机)
参数四:服务端的端口
*/
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入内容(输入exit退出输入):");
String msg = sc.nextLine();
byte[] bytes = msg.getBytes();
//退出输入
if(msg.equals("exit")){
System.out.println("退出输入成功");
socket.close();
break;
}
int length = bytes.length;
InetAddress address = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(bytes,length,address,6666);
//3.开始正式发送这个数据包的数据出去了
socket.send(packet);
}
}
}
客户端实现了反复发,服务端自然也要实现反复收
让以下收消息的代码也进入一个死循环(加入一个分割线,将消息分隔开)
注意:因为要不断的收消息,所以不能将close方法也写入死循环中
socket.receive(packet); int len = packet.getLength(); String s = new String(buffer,0,len); System.out.println(s);System.out.println("此客户端的IP地址:" + packet.getAddress().getHostAddress()); System.out.println("此客户端的端口:" + packet.getPort());System.out.println("------------------------------");
此时,服务端在接收一条消息后,会继续进入循环,等待下一条消息
要实现多个客户端发消息,再次运行一下客户端,会出现如下弹窗
让我们先停掉之前运行的客户端
那么如何实现多客户端呢?
此时我们需要进行一些配置:
允许多开实例↑
选中点击之后,点一下窗口右下角Apply,再点击OK。
注意:
要想实现多开,不能为客户端对象自定义端口,不然会出现端口占用的问题
把“7777”删掉,每次运行,java会自动生成一个端口,就没有问题了。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
服务端
*/
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("-----服务端启动-----");
System.out.println("------------------------------");
//1.创建服务端对象(接到韭菜的人) 注册端口
DatagramSocket socket = new DatagramSocket(6666);
//2.创建数据包对象,用于接收数据(创建一个韭菜盘子)
byte[] buffer = new byte[1024 * 64]; //64KB , 一包数据最大就是64KB
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
//3.使用数据包来接收客户端发过来的数据
socket.receive(packet);
//4.从字节数组中,把接收到的数据直接打印出来
// 接收多少就倒出多少
//获取本次数据包接收了多少数据
int len = packet.getLength();
String s = new String(buffer,0,len);
System.out.println(s);
System.out.println("客户端的IP地址:" + packet.getAddress().getHostAddress());
System.out.println("客户端的端口:" + packet.getPort());
System.out.println("------------------------------");
}
}
}
注:本文是黑马程序员磊哥视频的学习笔记,引用了部分图片便于理解,最后谢谢您的观看~