网络通信:UDP通信,一发一收,多发多收

发布于:2025-08-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

UDP通信

特点:无连接、不可靠通信
不事先建立连接;发送端每次把要发送的数据(限制在64kB内),接收端IP等信息封装成一个数据包,发出去就不管了

Java提供了一个java.net.DatagramSocket类来实现UDP通信

DatagramSocket:用于创建客户端、服务端

构造器 说明
public DatagramSocket() 创建客户端的Socket对象,系统会随机分配一个端口号
public DatagramSocket(int port) 创建服务端的Socket对象,并指定端口号
方法 说明
public void send(DatagramPacket dp) 发送数据包
public void receive(DatagramPacket p) 使用数据包接收数据

DatagramPacket:创建数据包

构造器 说明
public DatagramPacket(byte[] buf,int length,InetAddress address,int port 创建发出去的数据包对象
public DatagramPacket(byte[] buf,int length) 创建用来接收数据的数据包
方法 说明
public int getLength() 获取数据包,实际接收到的字节个数

一发一收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package d1_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {

    public static void main(String[] args) throws Exception {

        DatagramSocket server = new DatagramSocket(9870);

        byte[] bytes = new byte[1024 * 64];

        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);

        server.receive(datagramPacket);

        int length = datagramPacket.getLength();

        String s = new String(bytes,0,length);
        System.out.println(s);

//        System.out.println(datagramPacket.getAddress().getHostAddress());
//
//        System.out.println(datagramPacket.getPort());

        server.close();

    }
}

package d1_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {

    public static void main(String[] args) throws Exception {


        DatagramSocket client = new DatagramSocket();

        byte[] bytes = "我是客户端".getBytes();

        InetAddress localHost = InetAddress.getLocalHost();

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, localHost, 9870);

        client.send(datagramPacket);

        System.out.println("客户端数据发送完毕");

        client.close();

    }



}

多发多收

在这里插入图片描述
在这里插入图片描述

package d2_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws Exception {
        DatagramSocket server = new DatagramSocket(9870);
        byte[] bytes = new byte[1024 * 64];
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);

        while (true) {
            server.receive(datagramPacket);
            int length = datagramPacket.getLength();
            String s = new String(bytes,0,length);
            System.out.println(s);


        }

    }
}




package d2_udp;
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 {
        DatagramSocket client = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请说");
            String msg = scanner.next();
            byte[] bytes = msg.getBytes();
            if("exit".equals(msg)){
                System.out.println("欢迎下次光临,退出成功");
                client.close();
                break;
            }
            InetAddress localHost = InetAddress.getLocalHost();
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, localHost, 9870);

            client.send(datagramPacket);

        }

    }

}






网站公告

今日签到

点亮在社区的每一天
去签到