天天看點

Java網絡程式設計---UDP

UDP簡述

UDP是一種無連接配接傳輸協定(網絡中傳輸的資料格式在網絡程式設計中就被稱作協定)。該協定稱為使用者資料報協定。

UDP特點

1.無連接配接。隻要知道對端的IP和端口号就可以直接進行傳輸而不需要建立連接配接(例如生活中的發短信,隻管發,不在意對方是否能收到)

2.不可靠。沒有确認機制,沒有重傳機制。(例如打微信電話時候網絡不穩定或是信号不好,聽不清楚對方說什麼,這就是因為丢失資料包導緻的)

3.速度快。UDP是IOS模型傳輸層其中之一,除此之外還有TCP,TCP控制相對來說比較複雜,其中使用到的機制包括三次握手、流量控制、滑動視窗、序列号、确認号等,鍊路比較多。而UDP是無連接配接的,鍊路的開銷比較小是以速度快

代碼實作

用戶端

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        try {
            //建立發送端套接字
            DatagramSocket socket = new DatagramSocket();
            //指定ip
            InetAddress ip = InetAddress.getByName("localhost");
            //指定一個端口
            int port = 9999;
            //建立一個容器
            byte data[];
            while(true){
                System.out.println("你發送的東西");
                String str = sca.next();
                //把資料放進容器
                data = str.getBytes();
                //打包資料
                DatagramPacket packet = new DatagramPacket(data, data.length,ip,port);
                //發送資料報包
                socket.send(packet);
                if (str.equals("exit")){
                    break;
                }
            }
            //釋放資源
            socket.close();
        } catch (SocketException | UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           

伺服器

import java.io.IOException;
import java.net.*;

public class Server{
    public static void main(String[] args) {
        try {
            //建立套接字并将其綁定到本地主機上的指定端口。
            DatagramSocket socket = new DatagramSocket(9999);
            //建立接受資料的容器
            byte []data = new byte[1024];
            //建立一個接受資料的資料包
            DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
            while(true){
                //開始接收資料
                socket.receive(datagramPacket);
                //解析資料
                String str = new String(datagramPacket.getData(),0, datagramPacket.getLength());
                //接收到的資料
                System.out.println(datagramPacket.getAddress()+"發送的消息:"+str);
                if (str.equals("exit")){
                    break;
                }
            }
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           

PS:先啟動伺服器再啟動用戶端