天天看點

第四章、第6節 網絡程式設計

文章目錄

    • 一、網絡常識
    • 二、網絡程式設計 程式的分類:
    • 三、TCP協定 - OSI網絡模型
    • 四、三次握手 和 四次揮手(熟悉)
    • 五、TCP協定的 C/S 程式
      • 1、ServerSocket
        • 1-1、常用構造方法
        • 1-2、常用方法
      • 2、Socket
        • 2-1、常用構造方法
        • 2-2、常用方法
      • 3、案例echo程式
    • 六、UDP協定(資料報)程式 [了解]
    • 七、InetAddress描述IP位址的類
    • 八、基于C/S的項目布局截圖示例

一、網絡常識

1、什麼是計算機網絡?

​ 分布在不同地域的計算機,通過硬體等網絡裝置使用通信線路互相連接配接形成的一個網絡系統。計算機網絡,友善了資訊的傳遞,資源的共享。

2、什麼是計算機的IP位址?

​ IP位址是計算機在網際網路中的唯一辨別,如同一個在社會中的身份證号碼。

​ 本機IP:127.0.0.1(localhost)

3、什麼是網絡中網站的域名?

​ 域名可了解為IP位址的别名(如同手機号機主的姓名),更友善記憶,當輸入域名後(例如www.baidu.com),計算機會通路域名解析商,然後得到IP位址,再進行通路。

4、什麼是計算機的端口号?

​ 端口号的範圍 0 ~ 65535 之間,*****************

​ 與IP位址很相似,IP位址是計算機在網絡中的唯一辨別。

​ 端口号是計算機中程式的辨別,用于在一台計算機中區分不同的應用程式。

​ 端口号在使用時,應盡量避免 0 ~ 1024 之間的端口号,因為已經被一些知名的軟體 和 Windows作業系統所占用了。

5、什麼是計算機之間的通信協定?

​ 是計算機與計算機之間交流的标準。

​ 是對資料的傳輸速率,傳入接口,步驟控制,出錯控制等一系列制定的一套标準!

​ 常用的通信協定:

1.   http協定   :超文本傳輸協定,88端口号。
  2.   https協定  :安全的超文本傳輸協定,443端口号。
  3.   ftp協定    :檔案傳輸協定,21端口号。
  4.   TCP協定    :傳輸控制協定。
  5.   UDP協定	  :資料報協定。
           

二、網絡程式設計 程式的分類:

  1. B/S程式 : 浏覽器與伺服器程式。
  2. C/S程式 : 用戶端與伺服器程式。

三、TCP協定 - OSI網絡模型

指的是從一台計算機的軟體中,将資料發送到另一台計算機的軟體中的過程。

七層網絡模型:應用層 / 表現層 / 會話層 / 傳輸層 / 網絡層 / 資料鍊路層 / 實體層

四、三次握手 和 四次揮手(熟悉)

TCP協定用戶端與伺服器連接配接時,存在三次握手操作,確定消息能準确無誤的發送。

斷開連接配接時,存在四次揮手操作。

五、TCP協定的 C/S 程式

第四章、第6節 網絡程式設計
需要使用到兩個類來編寫TCP協定的 C/S 線程:
1.  ServerSocket    搭建伺服器。
  2.  Socket    搭建用戶端。
           
兩方使用Socket(套接字,通信端點)進行交流。

1、ServerSocket

用于建立伺服器,建立完畢後,會綁定一個端口号。

然後此伺服器可以等待用戶端連接配接。

每連接配接一個用戶端,伺服器就會得到一個新的Socket對象,用于跟用戶端進行通信。

1-1、常用構造方法

構造器 描述
ServerSocket(int port) 建立綁定到指定端口的伺服器套接字。

ServerSocket(int port);

建立一個基于TCP/IP協定的伺服器,并綁定指定的端口号。

注意:參數port的範圍是:0 ~ 65535(建議1025 ~ 65535)

1-2、常用方法

變量和類型 方法 描述
Socket accept() 偵聽對此套接字的連接配接并接受它。
void close() 關閉此套接字。

Socket accept();

​ 等待用戶端連接配接。

​ 此方法會導緻線程的阻塞!

​ 直到一個新的用戶端連接配接成功,return Socket對象後,線程在繼續執行。

void close();

​ 釋放占用的端口号,關閉伺服器。

2、Socket

兩台計算機之間通信的端點,是網絡驅動提供給應用程式程式設計的一種接口,一套标準,一種機制。

2-1、常用構造方法

構造器 描述
Socket(String host,int port) 建立流套接字并将其連接配接到指定主機上的指定端口号。

new Socket(String host,int port);

​ 建立一個套接字,并連接配接指定IP和端口号的伺服器。

​ 參數1. 伺服器的IP位址。

​ 參數2. 伺服器軟體的端口号。

2-2、常用方法

變量和類型 方法 描述
OutputStream getOutputStream() 傳回此套接字的輸出流。
InputStream getInputStream() 傳回此套接字的輸入流。
void close() 關閉此套接字。
int getPort() 傳回此套接字連接配接的遠端端口号。
InetAddress getInetAddress() 傳回套接字連接配接的位址。
boolean isClosed() 傳回套接字的關閉狀态。
boolean isConnected() 傳回套接字的連接配接狀态。
  • OutputStream getOutputStream();

    ​ 傳回的是指向通信另一端點的輸出流。

  • InputStream getInputStream();

    ​ 傳回的是指向通信另一端點的輸入流。

  • void close();

    ​ 關閉套接字。

注意:

​ 在網絡程式設計時,擷取輸入輸出流的操作,對于用戶端與伺服器來說是相對的:

​ 用戶端的輸入流,輸入的是伺服器的輸出流 輸出的内容。【用戶端讀,伺服器寫】

​ 用戶端的輸出流,輸出到了伺服器的輸入流中。【用戶端寫,伺服器讀】

​ 是以在使用時,需要注意一下一點規則:

​ 用戶端與伺服器擷取流的順序必須是相反的。

​ 例如:用戶端先得到了輸入流,那伺服器必須先擷取輸出流。

3、案例echo程式

用戶端:
public static void main(String[] args) throws IOException, InterruptedException {
	//1、連接配接伺服器
       Socket socket = new Socket("192.168.2.1",8888);
       //2、得到輸出流
       OutputStream os = socket.getOutputStream();
       //3、将輸出流,轉換為列印流
       PrintStream ps = new PrintStream(os);
       //4、得到輸入流
       InputStream is = socket.getInputStream();
       //5、将位元組輸入流,轉換為字元輸入流,并轉換為逐行讀取流
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);

       //6、循環接收使用者輸入
       Scanner input = new Scanner(System.in);
       while(true){
           System.out.print("請輸入要發送給伺服器的内容:");
           String text1 = input.nextLine();
           //7、将使用者輸入的内容,發送給伺服器
           ps.println(text1);
           //8、接收伺服器回複的消息
           String text2 = br.readLine();
           System.out.println(text2);
           //發送“886”退出
           if("886".equals(text1)){
               break;
           }
       }
}
           
伺服器:
public static void main(String[] args) throws Exception {
       //1、啟動伺服器,并偵聽8888端口号
       ServerSocket server = new ServerSocket(8888);
       //2、列印提示
       System.out.println("伺服器已啟動,等待用戶端連接配接中...");
       //3、等待用戶端連接配接
       Socket socket = server.accept();
       System.out.println("一個用戶端連接配接成功" + socket.getInetAddress().toString());
       //4、擷取輸入流
       InputStream is = socket.getInputStream();
       //5、将輸入的位元組流,轉換為字元流
       InputStreamReader isr = new InputStreamReader(is);
       //6、将位元組流,轉換為逐行讀取流
       BufferedReader bf = new BufferedReader(isr);
    
       //7、擷取輸出流
       OutputStream os = socket.getOutputStream();
       //8、将位元組輸出流,轉換為列印流
       PrintStream ps = new PrintStream(os);
    
       /**
     * 9、循環讀取一行行的資料,讀取操作會導緻線程的阻塞,直到用戶端真的發送了資料,
     *    伺服器才能接收到,順序繼續執行下面的代碼。
     */
    while(true){
        String text = br.readLine();
        //10、将這個文字,再列印給用戶端
        ps.println("伺服器:" + text);
        //收到“886”退出
        if("886".equals(text)){
            break;
        }
    }
}
           

六、UDP協定(資料報)程式 [了解]

使用者資料報協定,與TCP協定不同,UDP的連接配接是不可靠的,資料發送的成功與否 與 資料報是無關的。

使用到了兩個類:

1、資料報套接字:DatagramSocket

​ 用于發送 與 接收資料包的Socket

​ - 構造方法:

​ - DatagramSocket(int port);

​ - 參數:端口号

​ -常用方法:

​ -close() :關閉套接字。

​ -send(DatagramPacket dp)

​ 将一個資料包 dp 發送出去

​ -receive(DatagramPacket dp)

​ 接收一個資料包,并存儲到參數 dp 中。

2、資料包 DatagramPacket

​ 用于發送或接收資料時,盛放資料的對象!

​ -構造方法:

​ 1.用于發送資料時,組裝資料的構造方法。

​ DatagramPacket(byte[] bytes,int startIndex,int len, InetAddress ip,int port);

​ 參數1. 要發送的資料,是位元組數組的形成。

​ 參數2. 有效資料,在數組中的起始位置。

​ 參數3. 有效資料,在數組中的長度。

​ 參數4. 目前這個資料包,準備發送到IP位址,InetAddress這個類的對象,用于表述IP。

​ 得到InetAddress對象的方式:

​ -InetAddress ip = InetAddress.getByName(“192.168.2.1”);

​ 參數5. 目前這個資料包,準備發送到目标計算機的哪個端口号。

​ 2.用于接收資料時,存儲資料的 構造方法。

​ 建立的是不包含資料的資料包,用于在接收到資料後,存儲資料!

​ DatagramPacket(byte[] bytes,int len)

​ 參數1. 用于存儲資料的數組。

​ 參數2. 允許存儲的最大長度。

​ -常用方法:

​ byte[] getData()

​ 用于擷取資料包中的有效位元組數組。

​ int getLength

​ 用于擷取資料包中的有效資料的長度。

七、InetAddress描述IP位址的類

InetAddress 這個類的對象,用于描述IP。

得到InetAddress對象的方式:

​ InetAddress ip = InetAddress.getByName(“192.168.2.1”);

在UDP協定中,通過資料包DatagramPacket的getAddress方法,可以得到資料包來自哪個IP。

在TCP協定中,通過套接字Socket的getInetAddress方法,可以得到套接字連接配接的IP位址。

-常用方法:

​ 1.String getHostAddress();

​ IP位址字元串。

​ 2.String getHostName();

​ 計算名稱,當名稱無法擷取時,擷取的為IP位址。

八、基于C/S的項目布局截圖示例

第四章、第6節 網絡程式設計