java UDP详解


title: UDP
date: 2021-06-07 22:42:01
tags: NET
categories: Java
description: 
top_img: 
comments:
cover:



UDP

基本介绍

DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端。如下所示:

DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

Ø send(DatagramPacket p) :从此套接字发送数据报包。

Ø receive(DatagramPacket p) :从此套接字接收数据报包。

Ø close() :关闭此数据报套接字。

Ø DatagramPacket(byte[] buf, int length) :构造数据报包,用来接收长度为 length 的数据包。

Ø DatagramPacket(byte[] buf, int length, InetAddress address, int port) :构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

Ø getAddress() :获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的。

Ø getData() :获取发送或接收的数据。

Ø setData(byte[] buf) :设置发送的数据。

UDP通信编程基本步骤

  1. 创建客户端的DatagramSocket,创建时,定义客户端的监听端口。
  1. 创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口。

  2. 在服务器端定义DatagramPacket对象,封装待发送的数据包。

  3. 客户端将数据报包发送出去。

  4. 服务器端接收数据报包。

UDP实例

UDP Client

 		// 1、使用DatagramSocket指定端口创建发送端
        DatagramSocket clientSocket = new DatagramSocket(9999);
        //2、准备数据-定转成字节数组
        String data = "案发时官方";
        byte[] datas = data.getBytes("utf-8");
        //3. 封装成DatagramPacket包裹,需要指定目的地
        DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
        //4、 发送包裹send(DatagramPacket p)
        clientSocket.send(dataPacket);
        // 5.释放资源
        clientSocket.close();

UDP Server

	    // 1、使用DatagramSocket指定端口创建接收端
        DatagramSocket serviceSocket = new DatagramSocket(8888);
        //2、准备容器封装成DatagramPacket包裹
        byte[] container = new byte[1024*60];
        DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
        // 3、阻塞式接收包裹receive(DatagramPacket p)
        serviceSocket.receive(dataPacket);
        //4、分析数据
        // byte[] getData(
        // getLength(
        byte[] datas = dataPacket.getData();
        int len = dataPacket.getLength();
        System.out.println(new String(datas,0,len));
        //5释放资源
        serviceSocket.close();

UDP File Client

		// 1、使用DatagramSocket指定端口创建发送端
        DatagramSocket clientSocket = new DatagramSocket(9999);
        //2、准备数据-定转成字节数组

        String data = "案发时官方";
        byte[] datas = data.getBytes("utf-8");
        //3. 封装成DatagramPacket包裹,需要指定目的地
        DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
        //4、 发送包裹send(DatagramPacket p)
        clientSocket.send(dataPacket);
        // 5.释放资源
        clientSocket.close();

UDP File Server

        // 1、使用DatagramSocket指定端口创建接收端
        DatagramSocket serviceSocket = new DatagramSocket(8888);
        //2、准备容器封装成DatagramPacket包裹
        byte[] container = new byte[1024*60];
        DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
        // 3、阻塞式接收包裹receive(DatagramPacket p)
        serviceSocket.receive(dataPacket);
        //4、分析数据
        // byte[] getData(
        // getLength(
        byte[] datas = dataPacket.getData();
        int len = dataPacket.getLength();

        //5释放资源
        serviceSocket.close();

UDP Object Client

        // 1、使用DatagramSocket指定端口创建发送端
        DatagramSocket clientSocket = new DatagramSocket(8888);
        //2、准备数据-定转成字节数组
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(byteArrayOutputStream));
        oos.writeUTF("啦啦啦啦");
        People people = new People();
        people.setName("aaaa");
        people.setAge(18);
        oos.writeObject(people);
        oos.flush();
        byte[] bytes = byteArrayOutputStream.toByteArray();
        //3. 封装成DatagramPacket包裹,需要指定目的地
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 9999));
        //4、 发送包裹send(DatagramPacket p)
        clientSocket.send(packet);
        // 5.释放资源
        clientSocket.close();

UDP Object Server

		// 1、使用DatagramSocket指定端口创建接收端
        DatagramSocket serverSocket = new DatagramSocket(9999);
        //2、准备容器封装成DatagramPacket包裹
        byte[] container = new byte[1024*60];
        DatagramPacket packet = new DatagramPacket(container, 0, container.length);
        // 3、阻塞式接收包裹receive(DatagramPacket p)
        serverSocket.receive(packet);
        //4、分析数据
        // byte[] getData(
        // getLength(
        byte[] data = packet.getData();
        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(data)));
        Object str = ois.readUTF();
        Object sb = ois.readObject();
        if (str instanceof String){
            String a = (String)str;
            System.out.println("String:"+a);
        }
        if (sb instanceof People){
            People a = (People)sb;
            System.out.println("年龄:"+a.getAge());
        }
        //5释放资源
        serverSocket.close();

UDP Talk Client

 		// 1、使用DatagramSocket指定端口创建发送端
        DatagramSocket clientSocket = new DatagramSocket(9999);
        //2、准备数据-定转成字节数组
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            String data = bufferedReader.readLine();
            byte[] datas = data.getBytes("utf-8");
            //3. 封装成DatagramPacket包裹,需要指定目的地
            DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8888));
            //4、 发送包裹send(DatagramPacket p)
            clientSocket.send(dataPacket);
            if (data.equalsIgnoreCase("exit")){
                break;
            }
        }
        // 5.释放资源
        clientSocket.close();

UDP Talk Server

        // 1、使用DatagramSocket指定端口创建接收端
        DatagramSocket serverSocket = new DatagramSocket(8888);
        //2、准备容器封装成DatagramPacket包裹
        while (true){
            byte[] container = new byte[1024*60];
            DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);
            // 3、阻塞式接收包裹receive(DatagramPacket p)
            serverSocket.receive(dataPacket);
            //4、分析数据
            // byte[] getData(
            // getLength(
            byte[] datas = dataPacket.getData();
            int len = dataPacket.getLength();
            String da = new String(datas,0,len);
            System.out.println(da);
            if (da.equalsIgnoreCase("exit")){
                break;
            }
        }
        //5释放资源
        serverSocket.close();

Tread UDP

public class ClientStudent {    public static void main(String[] args) {        new Thread(new TalkSend(7777,"localhost",6666)).start();        new Thread(new TalkRecive(9999)).start();    }}-----------------------------------------------------------------------------------------------------public class ClientTeacher {    public static void main(String[] args) {        new Thread(new TalkSend(8888,"localhost",9999)).start();        new Thread(new TalkRecive(6666)).start();    }}-----------------------------------------------------------------------------------------------------public class TalkRecive implements Runnable {    private DatagramSocket serverSocket;    public TalkRecive(int port){        try {            serverSocket = new DatagramSocket(port);        } catch (SocketException e) {            e.printStackTrace();        }    }    @Override    public void run() {        while (true){            byte[] container = new byte[1024*60];            DatagramPacket dataPacket = new DatagramPacket(container,0,container.length);            // 3、阻塞式接收包裹receive(DatagramPacket p)            try {                serverSocket.receive(dataPacket);                //4、分析数据                // byte[] getData(                // getLength(                byte[] datas = dataPacket.getData();                int len = dataPacket.getLength();                String da = new String(datas,0,len);                System.out.println(da);                if (da.equalsIgnoreCase("exit")){                    break;                }            } catch (IOException e) {                e.printStackTrace();            }        }        serverSocket.close();    }}-----------------------------------------------------------------------------------------------------public class TalkSend implements Runnable {    private DatagramSocket clientSocket;    private BufferedReader bufferedReader;    private String toIP;    private int toPort;    public TalkSend(int Port,String toIP,int toPort){        this.toIP = toIP;        this.toPort = toPort;        try {            clientSocket = new DatagramSocket(Port);            bufferedReader = new BufferedReader(new InputStreamReader(System.in));        } catch (SocketException e) {            e.printStackTrace();        }    }    @Override    public void run() {        while (true){            String data = null;            try {                data = bufferedReader.readLine();                byte[] datas = data.getBytes("utf-8");                //3. 封装成DatagramPacket包裹,需要指定目的地                DatagramPacket dataPacket = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));                //4、 发送包裹send(DatagramPacket p)                clientSocket.send(dataPacket);                if (data.equalsIgnoreCase("exit")){                    break;                }            } catch (IOException e) {                e.printStackTrace();            }        }        clientSocket.close();    }}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM