20145238-荊玉茗 《Java程序設計》第10周學習總結

20145238 《Java程序設計》第10周學習總結

網絡編程html

·網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員所做的事情就是把數據發送到指定的位置,或者接收到指定的數據,這個就是狹義的網絡編程範疇。在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只須要調用便可。
·網絡編程就是兩個或多個設備之間的數據交換,其實更具體的說,網絡編程就是兩個或多個程序之間的數據交換,和普通的單機程序相比,網絡程序最大的不一樣就是須要交換數據的程序運行在不一樣的計算機上,這樣就形成了數據交換的複雜。雖然經過IP地址和端口能夠找到網絡上運行的一個程序,可是若是須要進行網絡編程,則還須要瞭解網絡通信的過程。java

·網絡通信方式: 在現有的網絡中,網絡通信的方式主要有兩種:程序員

一、 TCP(傳輸控制協議)方式
             二、 UDP(用戶數據報協議)方式
             這兩種傳輸方式都是實際的網絡編程中進行使用,重要的數據通常使用TCP方式進行數據傳輸,而大量的非核心數據則都經過UDP方式進行傳遞,在一些程序中甚至結合使用這兩種方式進行數據的傳遞。

·網絡編程步驟:spring

一、 創建網絡鏈接
客戶端網絡編程的第一步都是創建網絡鏈接。在創建網絡鏈接時須要指定鏈接到的服務器的IP地址和端口號,創建完成之後,會造成一條虛擬的鏈接,後續的操做就能夠經過該鏈接實現數據交換了。
二、 交換數據
鏈接創建之後,就能夠經過這個鏈接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,若是客戶端不發送請求則服務器端就不響應。
根據邏輯須要,能夠屢次交換數據,可是仍是必須遵循請求響應模型。
三、 關閉網絡鏈接
在數據交換完成之後,關閉網絡鏈接,釋放程序佔用的端口、內存等系統資源,結束網絡編程。
      最基本的步驟通常都是這三個步驟,在實際實現時,步驟2會出現重複,在進行代碼組織時,因爲網絡編程是比較耗時的操做,因此通常開啓專門的現場進行網絡通信。

·服務器端網絡編程步驟編程

一、 監聽端口
服務器端屬於被動等待鏈接,因此服務器端啓動之後,不須要發起鏈接,而只須要監聽本地計算機的某個固定端口便可。
這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。
二、 得到鏈接
當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也經過該鏈接進行數據交換。
通常在服務器端編程中,當得到鏈接時,須要開啓專門的線程處理該鏈接,每一個鏈接都由獨立的線程實現。
三、 交換數據
服務器端經過得到的鏈接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,而後進行邏輯處理,再把處理之後的結果數據發送給客戶端。簡單來講,就是先接收再發送,這個和客戶端的數據交換數序不一樣。
其實,服務器端得到的鏈接和客戶端鏈接是同樣的,只是數據交換的步驟不一樣。
固然,服務器端的數據交換也是能夠屢次進行的。
在數據交換完成之後,關閉和客戶端的鏈接。
四、 關閉鏈接
當服務器程序關閉時,須要關閉服務器端,經過關閉服務器端使得服務器監聽的端口以及佔用的內存能夠釋放出來,實現了鏈接的關閉。

TCP編程數組

·以java.net.Socket類表明客戶端鏈接,以java.net.ServerSocket類表明服務器端鏈接。在進行網絡編程時,底層網絡通信的細節已經實現了比較高的封裝,因此在程序員實際編程時,只須要指定IP地址和端口號碼就能夠創建鏈接了。
·在客戶端網絡編程中,首先須要創建鏈接,在Java API中以java.net.Socket類的對象表明網絡鏈接,因此創建客戶端網絡鏈接,也就是建立Socket類型的對象,該對象表明網絡鏈接,示例以下:服務器

Socket socket1 = new Socket(「192.168.1.103」,10000);

Socket socket2 = new Socket(「www.sohu.com」,80);

·若是須要在控制檯下面編譯和運行該代碼,須要首先在控制檯下切換到源代碼所在的目錄,而後依次輸入編譯和運行命令:網絡

javac –d . SimpleSocketClient.java
 java tcp.SimpleSocketClient

UDP通信
·UDP方式的網絡編程也在Java語言中得到了良好的支持,因爲其在傳輸數據的過程當中不須要創建專用的鏈接等特色。
· 在Java API中,實現UDP方式的編程,包含客戶端網絡編程和服務器端網絡編程,主要由兩個類實現,分別是:socket

· DatagramSocket
DatagramSocket類實現「網絡鏈接」,包括客戶端網絡鏈接和服務器端網絡鏈接。

· DatagramPacket
DatagramPacket類實現對於網絡中傳輸的數據封裝,也就是說,該類的對象表明網絡中交換的數據。

·UDP方式的網絡編程,編程的步驟和TCP方式相似,只是使用的類和方法存在比較大的區別。
·UDP客戶端編程涉及的步驟也是4個部分:創建鏈接、發送數據、接收數據和關閉鏈接。tcp

·UDP方式的網絡編程中創建鏈接的實現:
只須要創建一個鏈接對象便可, DatagramSocket ds = new DatagramSocket();
·能夠經過制定鏈接使用的端口號來建立客戶端鏈接。

DatagramSocket ds = new DatagramSocket(5000);

網絡協議:
·網絡協議是指對於網絡中傳輸的數據格式的規定。對於網絡編程初學者來講,沒有必要深刻了解TCP/IP協議簇,因此對於初學者來講去讀大部頭的《TCP/IP協議》也不是一件很合適的事情,由於深刻了解TCP/IP協議是網絡編程提升階段,也是深刻網絡編程底層時才須要作的事情。

對於通常的網絡編程來講,更多的是關心網絡上傳輸的邏輯數據內容,也就是更多的是應用層上的網絡協議,因此後續的內容均以實際應用的數據爲基礎來介紹網絡協議的概念。

· 網絡協議設計完成之後,在進行網絡編程時,就須要根據設計好的協議格式,在程序中進行對應的編碼了,客戶端程序和服務器端程序須要進行協議處理的代碼分別以下。

客戶端程序須要完成的處理爲:

一、 客戶端發送協議格式的生成
二、 服務器端反饋數據格式的解析

服務器端程序須要完成的處理爲:
一、 服務器端反饋協議格式的生成
二、 客戶端發送協議格式的解析

教材學習中的問題和解決過程

一、如何複用Socket鏈接?
示例代碼以下:

package tcp;
import java.io.*;
import java.net.*;
/**
 * 複用鏈接的Socket客戶端
 * 功能爲:發送字符串「Hello」到服務器端,並打印出服務器端的反饋
 */
public class MulSocketClient {
         public static void main(String[] args) {
                   Socket socket = null;
                   InputStream is = null;
                   OutputStream os = null;
                   //服務器端IP地址
                   String serverIP = "127.0.0.1";
                   //服務器端端口號
                   int port = 10000;
                   //發送內容
                   String data[] ={"First","Second","Third"};
                   try {
                            //創建鏈接
                            socket = new Socket(serverIP,port);
                            //初始化流
                            os = socket.getOutputStream();
                            is = socket.getInputStream();
                            byte[] b = new byte[1024];
                            for(int i = 0;i < data.length;i++){
                                     //發送數據
                                     os.write(data[i].getBytes());
                                     //接收數據
                                     int n = is.read(b);
                                     //輸出反饋數據
                                     System.out.println("服務器反饋:" + new String(b,0,n));
                            }
                   } catch (Exception e) {
                            e.printStackTrace(); //打印異常信息
                   }finally{
                            try {
                                     //關閉流和鏈接
                                     is.close();
                                     os.close();
                                     socket.close();
                            } catch (Exception e2) {}
                   }
         }
}
該示例程序和前面的代碼相比,將數據交換部分的邏輯寫在一個for循環的內容,這樣就能夠創建一次鏈接,依次將data數組中的數據按照順序發送給服務器端了。
                   若是仍是使用前面示例代碼中的服務器端程序運行該程序,則該程序的結果是:

                            java.net.SocketException: Software caused connection abort: recv failed

                                     at java.net.SocketInputStream.socketRead0(Native Method)

                                     at java.net.SocketInputStream.read(SocketInputStream.java:129)

                                     at java.net.SocketInputStream.read(SocketInputStream.java:90)

                                     at tcp.MulSocketClient.main(MulSocketClient.java:30)

服務器反饋:First

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第九周 300/2600 2/2 20/120
第十週 300/2900 2/4 18/140

參考資料

相關文章
相關標籤/搜索