Java UDP通信协议相关、DatagramSocket、DatagramPacket

UDP协议的特点

  • 面向无连接的协议
    发送端只管发送,不确认对方是否能收到。

  • 基于数据包进行数据传输。
    发送数据的包的大小限制64KB以内

  • 因为面向无连接,速度快,但是不可靠。会丢失数据。

UDP协议的使用场景

在线视频、网络语音电话

UDP协议相关的两个类

DatagramPacket

  • 数据包对象
    作用:用来封装要发送或要接收的数据,比如:集装箱。

DatagramSocket

  • 发送对象
    作用:用来发送或接收数据包,比如:码头。

DatagramPacket类构造器

发送端用:

new DatagramPacket(byte[] buf, int length, InetAddress address, int port)
创建发送端数据包对象

buf : 要发送的内容,字节数组
length : 要发送内容的长度,单位是字节
address : 接收端的IP地址对象
port : 接收端的端口号

接收端用:

new DatagramPacket(byte[] buf, int length)
创建接收端的数据包对象
buf : 用来存储接收到内容
length : 能够接收内容的长度

DatagramPacket类常用方法

int getlength : 获得实际接收到的字节个数

DatagramSocket类构造方法

DatagramSocket()创建发送端的Socket对象,系统会随机分配-一个端口号。
DatagramSocket( int port )创建接收端的Socket对象并指定端口号

DatagramSocket类成员方法

void send(DatagramPacket dp) : 发送数据包
void receive(DatagramPacket dp) : 接收数据包

举例 : 使用UDP实现客户端发,服务端收。

客户端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
 * 客户端
 * UDP实现客户端发
 */
public class udp_client {
    public static void main(String[] args) throws Exception{
        System.out.println("启动客户端");
        //1.创建一个集装箱对象,用于封装需要发送的数据包
        //参数一:封装数据的字节数组
        //参数二:发送数据的长度
        //参数三:服务端的ip地址
        //参数四:服务端程序的端口号码
        byte[] buffer = "使用UDP从客户端发送".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length
                , InetAddress.getLocalHost(),6666);

        //2.创建一个码头对象
        //参数可以申明客户端端口,可以有可以没有,默认给一个端口
        DatagramSocket socket = new DatagramSocket();

        //3.开始发送数据报对象
        socket.send(packet);
        socket.close();
    }
}

服务端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
 * 服务端
 * 接受客户端消息
 */
public class udp_server {
    public static void main(String[] args) throws Exception {

        System.out.println("启动服务端程序");
        //1.创建一个接受客户端的数据包对象(集装箱)
        /**
         * new DatagramPacket(byte[] buffer , int length)
         * 参数一:接受数据的数组
         * 参数二:接受数据的数组长度
         */
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

        //2.创建一个接收端的码头对象
        DatagramSocket socket = new DatagramSocket(6666);

        //3.开始接受
        socket.receive(packet);

        //4.从集装箱中获取本次读取的数据量
        int len = packet.getLength();

        //5.输出数据
        String rs = new String(buffer,0,len);
        System.out.println(rs);

        socket.close();
    }
}

你可能感兴趣的:(Java,网络,socket)