UDP通信实现一发一收(java代码)

UDP通信

特点:无连接、不可靠通信。

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

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

UDP通信实现一发一收(java代码)_第1张图片

一发一收

客户端Client

DatagramSocket socket = new DatagramSocket(); //创建客户端对象,此时要抛出异常

创建数据包对象封装要发出去的数据(首先来看DatagramPacket的源码)

public DatagramPacket(byte buf[], int length,

InetAddress address, int port)      

总共有四个参数,内容如下↓

参数一:封装要发出去的数据,转成字节数组        

参数二:发送出去的数据大小(字节个数)        

参数三:服务端的IP地址(找到服务端主机)        

参数四:服务端的端口

定义一个字符串,并使用getBytes()方法,转变成一个字节数组

定义整形变量记录字节个数

获取本机地址

(端口可以自己定义)

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();

整体代码

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地址(找到服务端主机)
        参数四:服务端的端口
         */

        byte[] bytes = "我是一个客户端,ABC123adc234".getBytes();
        int length = bytes.length;
        InetAddress address = InetAddress.getLocalHost();
        DatagramPacket packet = new DatagramPacket(bytes,length,address,6666);

        //3.开始正式发送这个数据包的数据出去了
        socket.send(packet);

        System.out.println("客户端数据发送完毕~~");
        socket.close(); // 释放资源
    }
}

服务端Server

创建的端口一定要和客户端的端口一致,否则无法接收数据

创建服务端对象                             注册端口
DatagramSocket socket = new DatagramSocket(6666);

创建数据包对象,用于接收数据

byte[] buffer = new byte[1024 * 64]; //64KB , 一包数据最大就是64KB
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

使用数据包来接收客户端发过来的数据(服务端.receive(包)方法

socket.receive(packet);

从字节数组中把接收到的数据直接打印出来

因为字节数组是64KB,如果客户端发送的数据没有那么大,会导致多倒一些东西出来,所以应该实现读取多少,倒出多少

int len = packet.getLength();

String s = new String(buffer,0,len);
System.out.println(s);

另外,也可以获取客户端的IP地址和端口(最后释放一下资源)

System.out.println("客户端的IP地址:" + packet.getAddress().getHostAddress());
System.out.println("客户端的端口:" + packet.getPort());
socket.close();

整体代码

public class Server {
    public static void main(String[] args) throws Exception {
        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);

        //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());

        socket.close();
    }
}

你可能感兴趣的:(udp,网络,网络协议,java,开发语言)