網路編程小結,編程一小時活動小結

來源:互聯網
上載者:User

網路編程小結,編程一小時活動小結

  • 網路編程的概述

  • 網路編程的三要素
    • IP地址
      • 什麼是IP地址
        • 是互連網上電腦的唯一標識.
      • InetAddress類_此類表示互連網協議 (IP) 地址
        • InetAddress類沒有建構函式,使用以下方法擷取InetAddress對象

static InetAddress[]

getAllByName(String host)

          在給定主機名稱的情況下,根據系統上配置的名稱服務返回其 IP 位址所組成的數組。

static InetAddress

getByAddress(byte[] addr)

          在給定原始 IP 位址的情況下,返回 InetAddress 對象。

static InetAddress

getByAddress(String host, byte[] addr)

          根據提供的主機名稱和 IP 位址建立 InetAddress。

static InetAddress

getByName(String host)

          在給定主機名稱的情況下確定主機的 IP 位址。

  • getByName("主機名稱(可重複)/字元字串的ip地址"):使用其他機器的ip地址字串產生一個InetAddress對象

static InetAddress

getLocalHost()

          返回本地主機。

  • InetAddress的其它方法

String

getHostAddress()

          返回 IP 位址字串(以文本表現形式)。

 String

getHostName()

          擷取此 IP 位址的主機名稱。

  • 連接埠號碼
    • 連接埠號碼的範圍:0~65535
    • 0~1023這個範圍的連接埠已經被系統使用
  • 協議
    • UDP協議
      • UDP協議的特點
        • 要發送的資料必須要封裝成資料包才能夠發送.
        • 每個資料包大小限制在64k中.
        • 因為面向無串連,所以速度快.
        • UDP協議不分用戶端和服務端,只分發送端和接受端.
      • UDP協議通訊涉及的類
        • 類 DatagramSocket

          此類表示用來發送和接收資料報包的通訊端

          • 構造方法

 

DatagramSocket()

構造資料通訊端並將其綁定到本地主機上任何可用的連接埠。

  • 成員方法

 void

close()

          關閉此資料通訊端。

void

send(DatagramPacket p)

          從此通訊端發送資料報包。

  

參數:

p - 將要發送的 DatagramPacket。

  

  • 類 DatagramPacket

    此類表示資料報包

    • 構造方法

  

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

構造資料報包,用來將長度為 length 的包發送到指定主機上的指定連接埠號碼。

  

參數:

buf - 包資料。

length - 包長度。

address - 目的地址。

port - 目的連接埠號碼。

  • UDP步驟_先啟動接收端,再啟動發送端(如果相反會發生資料丟失)
    • 發送端_步驟:
      • 先建立UDP協議的服務

        DatagramSocket socket = new DatagramSocket();

      • 準備資料,然後把資料封裝到集裝箱上

        String str = "這是我第一個udp的例子";

        byte[] buf = str.getBytes();

        DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),9090);

        //參數一: 資料的內容, 參數二: 資料的長度(位元組),參數三:ip地址, 參數四:連接埠

      • 使用UDP服務類進行發送

        socket.send(packet);

      • 關閉資源(關閉資源的作用:釋放連接埠號碼)

        socket.close();

    • 接收端_步驟:
      • 建立UDP的服務,需要監聽一個連接埠號碼

        DatagramSocket socket = new DatagramSocket(9090);

      • 建立一個空的集裝箱用於接收資料

        byte[] buf = new byte[1024];

        DatagramPacket packet = new DatagramPacket(buf, buf.length);

      • 使用空的資料包接收資料

        socket.receive(packet); //該方法是一個阻塞型的方法。接收發送端傳輸過來的資料。如果沒有 人給它發送訊息,會一直等待下去。

        System.out.println("接收到的資料有:"+new String(buf) );

      • 關閉資源

        socket.close();

  • TCP協議
    • TCP協議的特點
      • 發送的資料是基於IO流進行發送的
      • 發送的資料是沒有大小限制的
      • 使用了三向交握的機制,保證資料的完整性
      • 因為面串連,所以速度慢
      • TCP協議是分用戶端和服務端的
    • 涉及的類
      • 用戶端_類Socket

        此類實現用戶端通訊端(也可以就叫"通訊端")。通訊端是兩台機器間通訊的端點。

        • 構造方法

 

Socket(InetAddress address, int port)

          建立一個流通訊端並將其串連到指定 IP 位址的指定連接埠號碼。

  

參數:

address - IP 位址。

port - 連接埠號碼。

  

  • 成員方法

 InputStream

getInputStream()

          返回此通訊端的輸入資料流。

OutputStream

getOutputStream()

          返回此通訊端的輸出資料流。

  • 服務端_類ServerSocket

    此類實現伺服器通訊端。伺服器通訊端等待請求通過網路傳入。它基於該請求執行某些操作,然後可能向要求者返回結果。

    • 構造方法

 

ServerSocket(int port)

          建立綁定到特定連接埠的伺服器通訊端。

參數:

port - 連接埠號碼;或者為 0,表示使用任何空閑連接埠。

  

  • 成員方法

 Socket

accept()

          偵聽並接受到此通訊端的串連。

問題:

為什麼ServerSocket沒有設定擷取流(getOutputStream)對應的方法了?

因為服務端跟多個用戶端串連,為了防止搞亂,通過與每個用戶端建立socket來操作getOutputStream和getInputStream操作

  

  • TCP步驟_先啟動服務端,再啟動用戶端(如果相反會發生資料丟失)
    • 用戶端_步驟:
      • 建立TCP協議服務

        Socket socket = new Socket(InetAddress.getLocalHost(), 9090);

      • 給服務端發送訊息_用戶端給服務端寫資料

        OutputStream out = socket.getOutputStream();

        out.write("這個是我的第一個tcp的例子!".getBytes());

      • 擷取輸入資料流,讀取服務端傳輸的資料

        InputStream inputStream = socket.getInputStream();

        byte[] buf = new byte[1024];

        int length = inputStream.read(buf);

        System.out.println("用戶端收到的資料:"+ new String(buf,0,length));

      • 關閉用戶端資源

        socket.close();

    • 服務端_步驟:
      • 建立TCP協議服務端,並且需要監聽一個連接埠

        ServerSocket serverSocket = new ServerSocket(9090);

      • 接受用戶端的請求串連

        Socket socket = serverSocket.accept(); //這個方法是一個阻塞型 的方法,如果沒有用戶端與其串連,會一直等待下去。

      • 擷取輸入資料流,讀取用戶端傳輸的資料

        InputStream inputStream = socket.getInputStream() ;

        byte[] buf = new byte[1024];

        int length = 0;

        length = inputStream.read(buf);

        System.out.println("服務端接收到資料:"+ new String(buf,0,length));

      • 給用戶端發送訊息_服務端給用戶端寫資料

        //給用戶端發送訊息 服務端給用戶端寫資料

        OutputStream out = socket.getOutputStream();        //擷取輸出資料流對象

        out.write("用戶端,我收到了!".getBytes());

        關閉服務端資源

        serverSocket.close();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.