UDP通信实现多发多收 及 实现多客户端发送(java代码)

上一篇文章我们讲了UDP通信实现一发一收,本篇的多发多收就是在上篇文章的基础之上实现的。

上篇文章戳这里☞:UDP通信实现一发一收

多发多收

客户端Client

解析

首先,我们来改造一下客户端

我们让发消息的代码进入一个死循环

选中这一段内容,按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("------------------------------");
        }

    }
}

注:本文是黑马程序员磊哥视频的学习笔记,引用了部分图片便于理解,最后谢谢您的观看~

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值