網絡編程基礎、網絡通訊三要素、TCP通訊、Socket類

網絡編程基礎

軟件架構:
  • C/S架構: 即Client/Server(客戶端/服務器端)架構,QQ、迅雷。java

  • B/S架構: 即Browser/Server(瀏覽器端/服務器端)架構,簡化了系統的開發,維護和使用。谷歌、火狐。數據庫

B/S架構與C/S架構的區別:編程

  • C/S架構基於局域網的,而B/S架構基於廣域網的基礎上。瀏覽器

  • 硬件環境不一樣,C/S創建在專用網絡上,小範圍的網絡,能夠專門的服務器提供數據鏈接和數據交換安全

  • C/S通常面向的固定用戶羣體,對信息的安全控制較高較高一點。服務器

  • 對程序架構不一樣網絡

  • 用戶接口不一樣:C/S架構大多創建在Windows平臺上,B/S創建在瀏覽器上,不只能夠應用在Windows平臺上,也能夠應用在Unix/Linux等平臺上。多線程

兩種架構各有優劣,可是不管使用哪一種架構,都離不開網絡的支持。網絡編程,就是在必定的協議下,實現兩臺計算機通訊的程序。架構

網絡通訊協議

  • 網絡通訊協議:通訊協議是計算機通訊必須聽從的一種規則,協議中對數據的傳輸格式、傳輸的速率、傳輸的步驟等都作了統一的規定,通訊雙方必須同時遵照,最終實現數據的正常傳輸和交換。dom

  • TCP/IP:傳輸控制協議(TCP)/因特網互聯協議(IP),他們倆定義了計算機如何聯網、數據如何交換和傳輸的標準。它的內部包含了一系列用於處理數據通訊的協議,並採用了4層的分層模型,每一層都呼叫下一層所提供的協議來完成本身的請求。

協議分類

  • TCP協議:傳輸控制協議,該協議是面向鏈接的通訊協議,即數據傳輸前,在發送端和接收端先創建邏輯鏈接,而後再傳輸數據,它提供了兩臺計算機之間可靠的無差錯的數據傳輸。

    • 三次握手:在數據發送的準備階段,客戶端和服務器之間經過三次交互,保證鏈接的可靠性。

      三次握手:

經過三次握手,創建鏈接後,客戶端和服務器端就能夠進行數據傳輸了。因爲這種面相鏈接的特性,TCP協議可以數據傳輸的安全。因此應用挺普遍的,下載文件等。

  • ​ UDP:用戶數據報協議(User DataProgram Protocal),他是一個面相無鏈接的協議。在進行數據傳輸時,不須要創建鏈接。無論對方在不在,直接將數據、數據源和目的地封裝到數據包中,發送過去。每次發送的數據不能很大,限制在64K之內,數據有可能丟失,數據傳輸時不安全,速度快,QQ聊天

網絡編程三要素【瞭解】

  • 協議:計算機通訊必須遵照的規則。

  • IP地址:互聯網協議地址,俗稱IP,IP地址用來給網絡中的計算機編訂一個惟一的編號。

  • 端口號:端口號就是惟一標識設備中的進程(應用程序)。IP地址是惟一標識網絡中的設備。

  • IP地址:互聯網協議地址(Internet Protocol Address) ,俗稱IP,給網絡中的計算機設備編訂一個惟一的編號,比如人的身份證號。

    IP地址分類:

    • IPv4:是一個32位的二進制數,一般被分爲4個字節,表示形式:a.b.c.d ,例如:192.168.53.245 ,其中a.b.c.d都是一個0~255之間的十進制的整數,那麼最多可以表示42億個。

    • IPv6:爲了擴大地址空間,經過IPv6從新定義地址空間,採用128位地址長度,每16個字節分爲一組,分紅8組十六進制數 ,表示形式:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,號稱互聯網中的任何一粒沙子可以編寫進去,解決了地址不夠的問題。

  經過DOS命名查看本機的IP地址:ipconfig

  檢查網絡鏈接是否正常:ping ip地址

特殊的IP地址:

  本機的IP地址:127.0.0.1 localhost 經過hosts文件,能夠自定義本身的域名

  • 端口號:如何區分在網絡通訊中打開的這些進程(應用程序)?經過端口號能夠準確的找到彼此。

  • 端口號:用兩個字節表示的整數,它的取值範圍是0~65535。 其中,0~1023之間的的端口號被一些知名的應用和網絡服務佔用了。普通的常規的應用程序只能使用從1024以上的端口號, 若是端口號被另一個服務或者應用程序佔用了,會致使當前程序啓動失敗。

  經常使用的端口號:

   Tomcat應用服務器:8080

   HTTP服務器:80 www.baidu.com:80 80端口能夠選擇省略不寫

   數據庫服務器:MYSQL:3306 Oracle:1521

TCP通訊

目的:實現兩臺計算機之間的交互,通訊兩端要嚴格區分客戶端和服務器端口

兩端通訊的步驟:

  1. 服務端須要啓動,等待客戶端連接

  2. 客戶端須要主動地連接服務器端,連接成功才能通訊,服務器端口不能夠主動連接客戶端

在java中,提供兩個類,實現TCP通訊:

  • 客戶端:建立Socket對象,建立以後就至關於建立了客戶端,向服務器端發送連接請求,服務器端迴響一個請求表示已經接受,二者就創建了通訊

  • 服務器端:建立ServerSocket對象,建立以後就至關於,開啓了一個服務,等待客戶端連接

Socket類

Socket類,實現客戶端套接字,套接字指的是兩臺設備之間通信的端點,

構造方法:

public Socket(String host,int port);--->建立套接字對象並鏈接到指定主機的指定端口號,若是指定了host是一個null,那麼就至關於與指定地址爲回送地址【127.x.x.x】,是本機的回送地址,主要用於網絡軟件測試使用,本機上進程間的通訊。就不會進行網絡傳輸

成員方法:

  • public InputStream getInputStream();---->獲取套接字的輸入流

  • public OutputStream getOutputStream();--->獲取套接字輸出流

  • public void close();--->關閉套接字

  • public void shoutdownOutput();--->禁用套接字輸出流

  • 任何先前寫入的數據都將會被髮送,最後終止輸出流

ServerSocket類

ServerSocket類實現了服務器端套接字,該對象等待經過網絡的請求

構造方法:

ServerSocket(int port);--->使用該構造方法子建立ServerSocket建立對象時,就能夠將其綁定到一個指定的端口號上面,參數port就是端口號

成員方法:

public Socket accept();--->監聽並接受鏈接,返回一個新的Socket對象,用於和用戶端實現通訊。

文件上傳案例:

步驟:

  1. 在客戶端當中,經過輸入流,從硬盤當中讀取文件數據到內存

  2. 在客戶端當中,經過輸出流,寫入文件數據到服務器端

  3. 在服務器端中,經過輸入流,讀取文件數據到服務器端中

  4. 在服務器端中,經過輸出流,寫入文件數據到服務器硬盤當中

文件上傳圖解:

文件上傳優化

文件的名稱須要優化

服務端,保存文件的名稱若是名稱固定,那麼最終會致使服務器硬盤,只會保留一個文件,對上傳的文件名稱優化,

//文件名稱定義規則:
"beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";
服務器端接收文件的優化

服務器端,接收一個文件以後就關閉了,後面的其餘客戶端沒法繼續上傳文件,使用循環進行改進,能夠不斷的接收不一樣的客戶端傳輸過來的文件。

// 使用循環
while(true) {
   Socket socket =  serverSocket.accept(); 
   ....
   ....       
}
服務器端接收客戶端文件的效率的優化

服務器端,在接收文件的時候,加入某個客戶端給你傳輸一個大文件,此時就不能再接收其餘用戶的文件,因此能夠用多線程技術優化接收效率。

while(true) {
      Socket socket = serverSocket.accept();
      // 使用多線程技術,提升程序的效率
      // 有一個客戶端上傳文件,就開啓一個線程,完成文件的上傳
     new Thread(new Runnable() {
         // 重寫run方法,設定線程的任務
         @Override
         public void run() {
             // 使用網絡字節輸入流對象
            InputStream is =  socket.getInputStream();
            // 指定一個目錄
           File file =  new File("D:\\upload");
             if(!file.exits()) {
                 file.mkdirs();
             }
             // 防止同名的文件被覆蓋
         String filename =  "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";  
           // 構建一個本地的文件字節輸出流對象
             new FileOutputStream(file + "\\" + filename);
           // 一讀一寫完成文件的上傳,最終把文件寫入到服務器端的硬盤當中。  
          .....  
         }
     }).start();
}
// 服務端不關閉
// serverSocket.close();
相關文章
相關標籤/搜索