UDP编程多线程:一(服务器)对多(客户端)关系

服务器端

public class UDPServer02 {
    public static void main(String [] args){

        try {
            //1、创建服务器端,指定端口号
            DatagramSocket socket = new DatagramSocket(8800);
            System.out.println("***我是服务器端,等待客户端的请求***");
            //2、创建一个数据报,用来接收客户端发送的数据
            byte[] data = new byte[1024];
            int count = 0;
            //对接收的数据报进行循环监听,再循环读取
            //通过分析可知道读取需要传入的参数有数据类型、数据报、服务器端
            while (true){
                DatagramPacket packet = new DatagramPacket(data,data.length);
                socket.receive(packet);
                UDPServerThread udpServerThread = new UDPServerThread(data,packet,socket);
                //启动子线程
                udpServerThread.start();
                count++;
                System.out.println("目前一共有:"+count+"个客户端进行访问");

            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

子线程

public class UDPServerThread extends Thread {
    byte[] data;
    DatagramPacket packet;
    DatagramSocket socket;

    public UDPServerThread(byte[] data, DatagramPacket packet, DatagramSocket socket) {
        this.data = data;
        this.packet = packet;
        this.socket = socket;
    }

    @Override
    public void run() {
        //单个接收客户端的数据
        String info = new String(data,0,packet.getLength());
        System.out.println("我是服务器端,客户端说"+info);

        //向客户端发送数据
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] data2 = "欢迎您!".getBytes();
        //创建数据报,包含响应的数据信息
        DatagramPacket packet1 = new DatagramPacket(data2,data2.length,address,port);
        try {
            socket.send(packet1);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

客户端

public class UDPClient {
    public static void main(String [] args){
        try {
            //1、定义服务器端的地址、端口号、数据
            InetAddress address = InetAddress.getByName("localhost");
            int port = 8800;
            byte[] data = "用户名:**www*;密码:12343335".getBytes();//将字符型常量转换成字节型数组
            //2、创建要发送的数据报
            DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
            //3、向服务器发送数据
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet);
            //接收服务器的数据
            byte[] data1 = new byte[1024];
            DatagramPacket packet1 = new DatagramPacket(data1,data1.length);
            socket.receive(packet1);
            //将获取到的数据转换成string类型
            String reply = new String(data1,0,packet1.getLength());
            System.out.println("我是客户端,服务器端说:"+reply);
        } catch (UnknownHostException | SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果
在这里插入图片描述
在这里插入图片描述
如果对您有帮助,麻烦您点个赞哦~谢谢。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值