天天看點

java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定

文章目錄

  • 一、網絡程式設計三要素
    • 1.1、IP
    • 1.2、端口号
    • 1.3、協定
  • 二、InetAddress類
  • 三、UDP通信程式
    • 3.1、單點傳播
    • 3.2、多點傳播
    • 3.3、廣播
  • 四、TCP協定

一、網絡程式設計三要素

  1. IP
  2. 端口号
  3. 協定

1.1、IP

IP:配置設定給上網裝置的數字标簽(上網裝置在網絡上的唯一位址)

IPV4:采用

32位

位址長度,分

4

  • 目前主流方案
  • 最多

    2

    32

    次方個IP,目前已經用完
    java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定

IPV6:采用

128

位的位址長度,分

8

  • 為了解決

    IPV4

    不夠用的問題而出現的
  • 最多

    2

    128

    次方個IP
  • 甚至可以給地球上每一粒沙子都設定IP
java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定

1.2、端口号

由兩個位元組表示的整數,

0-65535

,其中

0-1023

用于知名的網絡服務和應用

反正要使用的話用

1024

以上的端口号

注意:一個端口号隻能被一個程式應用

java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定

1.3、協定

資料傳輸的規則

UDP協定:使用者資料報協定

  • 面向

    無連接配接

    通信協定
  • 速度快

    大小限制(一次最多64K)

    資料不安全

    容易丢失資料

  • 應用在丢失一些資料無所謂的場景,如:網絡會議,語音通話
  • 不管兩台電腦網絡是否連通,

    收不到就拉倒

TCP協定: 傳輸控制協定

  • 面向

    連接配接

    通信協定
  • 速度慢

    大小不限制

    資料安全

  • 應用在需要完整資料的場景,如:下載下傳軟體,文字通信
    java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定

二、InetAddress類

此類表示IP對象
  • 有兩個子類,

    Inet4Address

    Inet6Address

  • 是以在建立

    InetAddress

    時,底層會判斷目前系統使用的是

    IP4

    還是

    IP6

注意:此類沒有對外提供構造方法,是以不能new,隻能使用InetAddress.getByName()的方法建立對象,參數為主機名或IP

那麼建立出來的對象表示什麼?

就是IP對象,可以看做是一台電腦的對象

//    擷取InetAddress對象
    public void testInetAddress() throws UnknownHostException {
//        IP的對象  一台電腦的對象
        InetAddress address = InetAddress.getByName("DESKTOP-6RGC961");

//      getHostName() 小細節:如果因為網絡原因或者區域網路中壓根沒有這個台電腦,會傳回IP
        String hostName = address.getHostName();
        System.out.println(hostName);

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress);
    }
           

三、UDP通信程式

UDP的三種通信方式:

  1. 單點傳播:發送給一台電腦
  2. 多點傳播:發送給一組電腦
多點傳播位址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255 為預留的多點傳播位址
  1. 廣播:發送給區域網路的所有電腦
廣播位址:255.255.255.255

3.1、單點傳播

發送端步驟:

  1. 建立發送端的

    DatagramSocket

    對象
  2. 資料打包(

    DatagramPacket

    對象)
  3. 發送資料
  4. 關閉連接配接
public void testUDPsend() throws IOException {
//        1.建立DatagramSocket對象
//        細節:
//           綁定端口以後就是用這個端口發送
//           有參:指定端口綁定
//           無參:随機端口綁定
        DatagramSocket datagramSocket = new DatagramSocket();
//        2.打包資料
        String str = "我是發送的資料!";//資料
        byte[] strBytes = str.getBytes();//資料轉位元組
        InetAddress address = InetAddress.getByName("127.0.0.1");//得到接受的IP對象
        int port = 10086;//設定端口号
        DatagramPacket datagramPacket=new DatagramPacket(strBytes,strBytes.length,address,port);
//        3.發送
        datagramSocket.send(datagramPacket);
//        4.關閉連接配接,釋放資源
        datagramSocket.close();
    }
           

接受端步驟:

  1. 建立發送端的

    DatagramSocket

    對象
  2. 接受打包好的資料(

    DatagramPacket

  3. 解析資料包
  4. 釋放資源

注意:接受打包好的資料是阻塞的,執行到這裡會死等,直到有資訊發過來

//    建立UDP通信,接受端
    public void testUDPreceive() throws IOException {
//        1.建立接受對象
//        細節:
//        接受一定要綁定端口
//        發送時指定的是什麼端口,就綁定什麼端口
        DatagramSocket datagramSocket = new DatagramSocket(10086);
//        2.接受資料
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket);
//        3.解析資料
        byte[] data = datagramPacket.getData();
        System.out.println("接受到的資料是:"+new String(data,0,data.length));
        InetAddress address = datagramPacket.getAddress();
        System.out.println("接受到的位址是:"+address);
        int port = datagramPacket.getPort();
        System.out.println("發送的端口是:"+port);
//        4.釋放資源
        datagramSocket.close();
    }

           

3.2、多點傳播

在單點傳播的基礎上做了修改
  1. 不再是建立

    DatagramSocket

    對象,而是

    MulticastSocket

    對象
  2. InetAddress.getByName("225.0.0.1");

    更換成多點傳播的位址來設定傳送的位址,隻要是多點傳播内能使用的位址都行
  3. 接受端需要将本機添加到 發送端設定的位址添加到多點傳播中

    InetAddress address = InetAddress.getByName("225.0.0.1");

    multicastSocket.joinGroup(address );

  4. 多點傳播接受對象可以很多個
public static void main(String[] args) throws IOException {
//      1.建立發送對象
        MulticastSocket multicastSocket = new MulticastSocket();
//      2.打包資料
        String str = "我是發送的資料";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("225.0.0.1");
        int port = 10086;
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
//      3.發送資料
        multicastSocket.send(datagramPacket);
//      4.釋放資源
        multicastSocket.close();
    }
           
public static void main(String[] args) throws IOException {
//      1.建立接受對象
        MulticastSocket multicastSocket = new MulticastSocket(10086);
//       2.将本機添加到225.0.0.1這一組
        InetAddress byName = InetAddress.getByName("225.0.0.1");
        multicastSocket.joinGroup(byName);
//       3.得到資料
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        multicastSocket.receive(datagramPacket);
//        4.解析資料
        byte[] data = datagramPacket.getData();
        InetAddress address = datagramPacket.getAddress();
        String str = new String(data, 0, data.length);
        System.out.println(address + "說:" + str);
//        5.關閉連接配接
        multicastSocket.close();
    }

           

3.3、廣播

在單點傳播的基礎上,将發送的位址改成廣播的位址(255.255.255.255)

四、TCP協定

TCP通信協定是一種可靠的網絡協定
  • 它在通信的兩端各自建立

    Socket

    對象
  • 通信之前

    確定通信連接配接

  • 通過

    Socket

    産生

    IO流

    來進行網絡通信

用戶端書寫步驟:

  1. 建立用戶端Socket對象(

    Socket

    )與指定服務端連接配接

Socket(String host,int port)

  1. 擷取輸出流,寫資料

OutputStream getOutputStream()

  1. 關閉連接配接

void close()

服務端書寫步驟:

  1. 建立服務端的Socket對象(

    serverSocket

serverSocket(int port)

  1. 建立監聽,監聽用戶端,傳回一個

    Socket

    對象

Socket accept()

  1. 擷取輸入流,讀資料

InputStream getInputStream()

  1. 關閉連接配接

void close()

用戶端代碼:

public class Main {
    public static void main(String[] args) throws IOException {
//        1.建立Socket連接配接
//        細節:
//        在建立的同時會連接配接服務端
//                連接配接不上會報錯
        Socket socket = new Socket("127.0.0.1",10086);
//        2.調用輸入流
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好啊".getBytes());
//        3.關閉
        outputStream.close();
        socket.close();
    }
}
           

服務端代碼:

public class MainServerSocket {
    public static void main(String[] args) throws IOException {
//        1.建立ServerSocket連接配接
        ServerSocket serverSocket = new ServerSocket(10086);
//        2.監聽用戶端的連接配接
        Socket socket = serverSocket.accept();
//            3.擷取輸入流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int b;
        while ((b =bufferedReader.read())!=-1){
            System.out.print((char) b);
        }
//        4.關閉連接配接
        socket.close();
        serverSocket.close();
    }
}