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