程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> java 網絡編程 UDP TCP

java 網絡編程 UDP TCP

編輯:JAVA編程入門知識

 

網絡編程

網絡編程主要用於解決計算機與計算機(手機、平板..)之間的數據傳輸問題。

網絡編程: 不需要基於html頁面就可以達到數據之間的傳輸。 比如: feiQ , QQ , 微信....
網頁編程: 就是要基於html頁面的基礎上進行數據的交互的。 比如: 珍愛網、 oa(辦公自動化)、 高考的報告系統...

計算機網絡:

分布在不同地域 的計算機通過外部設備鏈接起來達到了消息互通、資源共享的效果就稱作為一個計算機網絡。
網絡通訊的三要素
    1. IP
    2. 端口號。
    3. 協議.

IP

192.168.10.1
IP地址:    IP地址的本質就是一個由32位的二進制數據組成的數據。 後來別人為了方便我們記憶IP地址,就把IP地址切成了4份,每份8bit.   2^8 = 0~255
      00000000-00000000-00000000-00000000

IP地址 = 網絡號+ 主機號。

IP地址的分類:
    A類地址 =一個網絡號 + 三個主機號     2^24     政府單位
    B類地址 =兩個網絡號 + 兩個主機號     2^16     事業單位(學校、銀行..)
    C類地址= 三個網絡號 + 一個主機號     2^8       私人使用..

InetAddress(IP類)
常用的獲取address對象的方法:
    getLocalHost() 獲取本機的IP地址
    getByName("IP或者主機名") 根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。 (用於獲取別人的IP地址對象)

 

 getHostAddress()  返回一個IP地址的字符串表示形式。
    getHostName()  返回計算機的主機名。

// getLocalHost 獲取本機的IP地址對象
        /*
         * InetAddress address = InetAddress.getLocalHost();
         * System.out.println("IP地址:"+address.getHostAddress());
         * System.out.println("主機名:"+address.getHostName());
         */

        // 獲取別人機器的IP地址對象。

        // 可以根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。
        InetAddress address = InetAddress.getByName("YIFAN");
        System.out.println("IP地址:" + address.getHostAddress());
        System.out.println("主機名:" + address.getHostName());

端口

端口號是沒有類描述的。
      端口號的范圍: 0~65535
          從0到1023,   系統緊密綁定於一些服務。
         1024~65535   我們可以使用....

網絡通訊的協議: 

  在java中網絡通訊業稱作為Socket(插座)通訊,要求通訊 的兩台器都必須要安裝Socket。

  不同的協議就有不同 的插座(Socket)

udp通訊協議  

  UDP通訊協議的特點:   

    1. 將數據極封裝為數據包,面向無連接。
    2. 每個數據包大小限制在64K中
    3. 因為無連接,所以不可靠
    4. 因為不需要建立連接,所以速度快
    5. udp 通訊是不分服務端與客戶端的,只分發送端與接收端。    

    比如: 物管的對講機, 飛Q聊天、 游戲...

udp協議下的Socket:

    DatagramSocket           (udp插座服務)
    DatagramPacket           (數據包類)
    DatagramPacket           (buf, length, address, port)
    buf:                     發送的數據內容
    length :                發送數據內容的大小。
    address :             發送的目的IP地址對象
    port :                   端口號。

發送端的使用步驟: 

    1. 建立udp的服務。
    2. 准備數據,把數據封裝到數據包中發送。 發送端的數據包要帶上ip地址與端口號。
    3. 調用udp的服務,發送數據。
    4. 關閉資源。
發送端demo:

public class Demo1Sender {
    public static void main(String[] args) throws IOException {
        // 建立udp的服務
        DatagramSocket datagramSocket = new DatagramSocket();
        // 准備數據,把數據封裝到數據包中。
        String data = "這個是我第一個udp的例子..";
        // 創建了一個數據包
        DatagramPacket packet = new DatagramPacket(data.getBytes(),
                data.getBytes().length, InetAddress.getLocalHost(), 9090);
        // 調用udp的服務發送數據包
        datagramSocket.send(packet);
        // 關閉資源 ---實際上就是釋放占用的端口號
        datagramSocket.close();
    }
}

 

接收端的使用步驟     

  1. 建立udp的服務
     2. 准備空 的數據 包接收數據。
     3. 調用udp的服務接收數據。
     4. 關閉資源

接收端demo:

public class Demo1Receive {

    public static void main(String[] args) throws IOException {
        // 建立udp的服務 ,並且要監聽一個端口。
        DatagramSocket socket = new DatagramSocket(9090);

        // 准備空的數據包用於存放數據。
        byte[] buf = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); // 1024
        // 調用udp的服務接收數據
        socket.receive(datagramPacket); // receive是一個阻塞型的方法,沒有接收到數據包之前會一直等待。
                                        // 數據實際上就是存儲到了byte的自己數組中了。
        System.out.println("接收端接收到的數據:"
                + new String(buf, 0, datagramPacket.getLength()));  // getLength()
                                                                    // 獲取數據包存儲了幾個字節。
        // 關閉資源
        socket.close();

    }

}

 

以上程序 分來運行,一個在命令行 ,一個在Eclipse。

udp是一個不可靠(數據包可能會丟失)的協議

什麼情況下數據包會出現丟失呢?
    1.帶寬不足 。
    2.cpu的處理能力不足。

public class SafeReceive {
    
    public static void main(String[] args) throws IOException, Exception {
        //建立udp的服務
        DatagramSocket socket = new DatagramSocket(9090);
        
        //建立空的數據包存儲數據
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        
        //不斷接收數據包
        while(true){
            socket.receive(packet);
            System.out.println(new String(buf,0,packet.getLength()));
            Thread.sleep(10);
        }
    }
}

 

tcp通訊協議

 TCP通訊協議特點:
    1. tcp是基於IO流進行數據 的傳輸 的,面向連接。
    2. tcp進行數據傳輸的時候是沒有大小限制的。
    3. tcp是面向連接,通過三次握手的機制保證數據的完整性。 可靠協議。
    4. tcp是面向連接的,所以速度慢。
    5. tcp是區分客戶端與服務端 的。

  比如: 打電話、 QQ\feiQ的文件傳輸、 迅雷下載....

 */

 tcp協議下的Socket:
    Socket(客戶端) , tcp的客戶端一旦啟動馬上要與服務端進行連接。
    ServerSocket(服務端類)

tcp的客戶端使用步驟:
    1. 建立tcp的客戶端服務。
    2. 獲取到對應的流對象。
    3.寫出或讀取數據
    4. 關閉資源。

public class Demo1Clinet {
    
    public static void main(String[] args) throws IOException{
        //建立tcp的服務
        Socket socket  = new Socket(InetAddress.getLocalHost(),9090);
        //獲取到Socket的輸出流對象
        OutputStream outputStream = socket.getOutputStream();
        //利用輸出流對象把數據寫出即可。
        outputStream.write("服務端你好".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的服務端
/*
    java.net.BindException:   端口被占用。

ServerSocket的使用 步驟
    1. 建立tcp服務端 的服務。
    2. 接受客戶端的連接產生一個Socket.
    3. 獲取對應的流對象讀取或者寫出數據。
    4. 關閉資源。

 

//服務端
public class Demo1Server {

    public static void main(String[] args) throws Exception {
        //建立Tcp的服務端,並且監聽一個端口。
        ServerSocket serverSocket = new ServerSocket(9090);
        //接受客戶端的連接
        Socket socket  =  serverSocket.accept(); //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));
        
        //獲取socket輸出流對象,想客戶端發送數據
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("客戶端你好啊!".getBytes());
        
        
        //關閉資源
        serverSocket.close();
        
    }
    
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved