1. 程式人生 > 實用技巧 >網路通訊協議(一)

網路通訊協議(一)

一、網路通訊協議

  網路通訊協議有很多種,目前應用最廣泛的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),

  它是一個包括TCP協議和IP協議,UDP(User Datagram Protocol)協議和其它一些協議的協議組

  

  鏈路層:鏈路層用於定義物理傳輸通道,通常是對某些網路連線裝置的驅動協議,例如針對光纖、網線提供的驅動。

  網路層:網路層是整個TCP/IP協議的核心,它主要用於將傳輸的資料進行分組,將分組資料傳送到目標計算機或者網路。

  傳輸層:主要使網路程式進行通訊,在進行網路通訊時,可以採用

TCP協議,也可以採用UDP協議。

  應用層:主要負責應用程式的協議,例如HTTP協議、FTP協議等。

二、IP地址和埠號

  要想使網路中的計算機能夠進行通訊,必須為每臺計算機指定一個標識號,通過這個標識號來指定接受資料的計算機或者傳送資料的計算機。

  在TCP/IP協議中,這個標識號就是IP地址,它可以唯一標識一臺計算機

  通過IP地址可以連線到指定計算機,但如果想訪問目標計算機中的某個應用程式,還需要指定埠號。

  在計算機中,不同的應用程式是通過埠號區分的。埠號是用兩個位元組(16位的二進位制數)表示的,

  它的取值範圍是0~65535,其中,0~1023之間的埠號用於一些知名的網路服務和應用,使用者的普通應用程式需要使用1024以上的埠號,從而避免埠號被另外一個應用或服務所佔用。

三、InetAddress

  InetAddress類的一些常用方法

  

public class Example01 {
    public static void main(String[] args) throws Exception {
        InetAddress local = InetAddress.getLocalHost();
        InetAddress remote = InetAddress.getByName("www.oracle.cn");
        System.out.println("本機的IP地址:" + local.getHostAddress());
        System.out.println(
"oracle的IP地址:" + remote.getHostAddress()); System.out.println("oracle的主機名為:" + remote.getHostName()); } }

四、UDP和TCP協議

  1、UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。

    簡單來說,當一臺計算機向另外一臺計算機發送資料時,傳送端不會確認接收端是否存在,就會發出資料,

   同樣接收端在收到資料時,也不會向傳送端反饋是否收到資料。

  2、TCP協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸。

    在TCP連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過“三次握手”。

    第一次握手,客戶端向伺服器端發出連線請求,等待伺服器確認,

    第二次握手,伺服器端向客戶端回送一個響應,通知客戶端收到了連線請求,

    第三次握手,客戶端再次向伺服器端傳送確認資訊,確認連線。

五、UDP通訊

  1、DatagramPacket構造方法

    在建立傳送端和接收端的DatagramPacket物件時,使用的構造方法有所不同,

    接收端的構造方法只需要接收一個位元組陣列來存放接收到的資料,

    而傳送端的構造方法不但要接收存放了傳送資料的位元組陣列,還需要指定傳送端IP地址和埠號。

    

    使用該構造方法在建立DatagramPacket物件時,指定了封裝資料的位元組陣列和資料的大小,沒有指定IP地址和埠號。

     很明顯,這樣的物件只能用於接收端,不能用於傳送端。因為傳送端一定要明確指出資料的目的地(ip地址和埠號),而接收端不需要明確知道資料的來源,只需要接收到資料即可。

    

    用該構造方法在建立DatagramPacket物件時,不僅指定了封裝資料的位元組陣列和資料的大小,還指定了資料包的目標IP地址(addr)和埠號(port)。

    該物件通常用於傳送端,因為在傳送資料時必須指定接收端的IP地址和埠號,就好像傳送貨物的集裝箱上面必須標明接收人的地址一樣。

   2、DatagramPacket常用方法

    

  3、DatagramSocket

    DatagramSocket類的作用就類似於碼頭,使用這個類的例項物件就可以傳送和接收DatagramPacket資料包

    在建立傳送端和接收端的DatagramSocket物件時,使用的構造方法也有所不同

    

    該構造方法用於建立傳送端的DatagramSocket物件,在建立DatagramSocket物件時,並沒有指定埠號,此時,系統會分配一個沒有被其它網路程式所使用的埠號。

    

    構造方法既可用於建立接收端的DatagramSocket物件,又可以建立傳送端的DatagramSocket物件,

    在建立接收端的DatagramSocket物件時,必須要指定一個埠號,這樣就可以監聽指定的埠。

  4、DatagramSocket常用方法

    

六、UDP網路程式  

  1、UDP完成資料傳送   

/*
* 傳送端
 * 1,建立DatagramPacket物件,封裝資料,接收的地址和埠
 * 2,建立DatagramSocket物件
* 3,呼叫DatagramSocket中的send方法,傳送資料包
 * 4,關閉資源DatagramSocket
 */
public class UDPSend {
    public static void main(String[] args) throws IOException {
        //1,建立DatagramSocket物件
        DatagramSocket sendSocket = new DatagramSocket();
        //2,建立DatagramPacket物件,並封裝資料
        //public DatagramPacket(byte[] buf, int length, InetAddress address,  int port)
        //構造資料報包,用來將長度為 length 的包傳送到指定主機上的指定埠號。
        byte[] buffer = "hello,UDP".getBytes();
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.75.58"), 12306);
        //3,傳送資料
        //public void send(DatagramPacket p) 從此套接字傳送資料報包
        sendSocket.send(dp);
        //4,釋放流資源
        sendSocket.close();
    }
}

  2、UDP完成資料的接收

/*
 * UDP接收端
 * 
 * 1,建立DatagramSocket物件,繫結埠號(要和傳送端埠號一致)
 * 2,建立位元組陣列,接收發來的資料
 * 3,建立資料包物件DatagramPacket
 * 4,呼叫DatagramSocket物件方法receive(DatagramPacket dp)接收資料,資料放在資料包中
 * 5,拆包
      傳送的IP地址
          資料包物件DatagramPacket方法getAddress()獲取的是傳送端的IP地址物件
          返回值是InetAddress物件
      接收到的位元組個數
          資料包物件DatagramPacket方法getLength()
      傳送方的埠號
          資料包物件DatagramPacket方法getPort()傳送埠
 * 6,關閉資源
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        //1,建立DatagramSocket物件,並指定埠號
        DatagramSocket receiveSocket = new DatagramSocket(12306);
        //2,建立DatagramPacket物件, 建立一個空的倉庫
        byte[] buffer = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buffer, 1024);
        //3,接收資料儲存到DatagramPacket物件中
        receiveSocket.receive(dp);
        //4,獲取DatagramPacket物件的內容
        //誰發來的資料  getAddress()
        InetAddress ipAddress = dp.getAddress();
        String ip = ipAddress.getHostAddress();//獲取到了IP地址
        //發來了什麼資料  getData()
        byte[] data = dp.getData();
        //發來了多少資料 getLenth()
        int length = dp.getLength();
        //顯示收到的資料
        String dataStr = new String(data,0,length);
        System.out.println("IP地址:"+ip+ "資料是"+ dataStr);
        //5,釋放流資源
        receiveSocket.close();
    }
}