# 20155337 2016-2017-2 《Java程序設計》第十週學習總結

20155337 2016-2017-2 《Java程序設計》第十週學習總結

教材學習內容總結

網絡編程
•網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員所做的事情就是把數據發送到指定的位置,或者接收到指定的數據。在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只須要調用便可。html

網絡概述

•1.1計算機網絡概述:

照計算機網絡的定義,經過必定的物理設備將處於不一樣位置的計算機鏈接起來組成的網絡,這個網絡中包含的設備有:計算機、路由器、交換機等等。java

路由器和交換機組成了核心的計算機網絡,計算機只是這個網絡上的節點以及控制等,經過光纖、網線等鏈接將設備鏈接起來,從而造成了一張巨大的計算機網絡。程序員

爲了可以方便的識別網絡上的每一個設備,網絡中的每一個設備都會有一個惟一的數字標識,這個就是IP地址。編程

一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。數組

注意: 在硬件上規定,端口的號碼必須位於0-65535之間,每一個端口惟一的對應一個網絡程序,一個網絡程序可使用多個端口。瀏覽器

•1.2網絡編程概述:

網絡編程就是兩個或多個設備之間的數據交換,其實更具體的說,網絡編程就是兩個或多個程序之間的數據交換,和普通的單機程序相比,網絡程序最大的不一樣就是須要交換數據的程序運行在不一樣的計算機上,這樣就形成了數據交換的複雜。服務器

「請求-響應」模型:也就是通信的一端發送數據,另一端反饋數據,網絡通信都基於該模型。網絡

客戶端/服務器結構:也叫作Client/Server結構,簡稱C/S結構。一旦通信創建,則客戶端和服務器端徹底同樣,沒有本質的區別。這種結構的優點表現力豐富,而服務器端也須要專門進行開發。可是這種結構也存在着不少不足,例如通用性差,實際維護時,也須要維護專門的客戶端和服務器端,維護的壓力比較大。socket

瀏覽器/服務器結構:也叫作Browser/Server結構,簡稱爲B/S結構。 使用B/S結構的程序,在開發時只須要開發服務器端便可,這種結構的優點在於開發的壓力比較小,不須要維護客戶端。tcp

P2P(Point to Point)程序:是一種特殊的程序,應該一個P2P程序中既包含客戶端程序,也包含服務器端程序。

協議(Protocol):網絡中傳輸的數據格式在網絡編程中就被稱做協議。

•1.3網絡通信方式:

一、TCP(傳輸控制協議)方式 :TCP方式就相似於撥打電話,使用該種方式進行網絡通信時,須要創建專門的虛擬鏈接,而後進行可靠的數據傳輸,若是數據發送失敗,則客戶端會自動重發該數據。

二、 UDP(用戶數據報協議)方式:而UDP方式就相似於發送短信,使用這種方式進行網絡通信時,不須要創建專門的虛擬鏈接,傳輸也不是很可靠,若是發送失敗則客戶端沒法得到。

小結:重要的數據通常使用TCP方式進行數據傳輸,而大量的非核心數據則都經過UDP方式進行傳遞,在一些程序中甚至結合使用這兩種方式進行數據的傳遞。因爲TCP須要創建專用的虛擬鏈接以及確認傳輸是否正確,因此使用TCP方式的速度稍微慢一些,並且傳輸時產生的數據量要比UDP稍微大一些。

網絡編程技術

•2.1網絡編程步驟

這裏的步驟實現和語言無關,也就是說,這個步驟適用於各類語言實現。

•2.1.1客戶端網絡編程步驟:

•創建網絡鏈接:客戶端網絡編程的第一步都是創建網絡鏈接。在創建網絡鏈接時須要指定鏈接到的服務器的IP地址和端口號,創建完成之後,會造成一條虛擬的鏈接,後續的操做就能夠經過該鏈接實現數據交換了。

•交換數據:鏈接創建之後,就能夠經過這個鏈接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到服務器,服務器反饋一個響應數據給客戶端,若是客戶端不發送請求則服務器端就不響應。根據邏輯須要,能夠屢次交換數據,可是仍是必須遵循請求響應模型。

•關閉網絡鏈接:在數據交換完成之後,關閉網絡鏈接,釋放程序佔用的端口、內存等系統資源,結束網絡編程。

•2.1.2服務器端網絡編程步驟:

•監聽端口:服務器端屬於被動等待鏈接,因此服務器端啓動之後,不須要發起鏈接,而只須要監聽本地計算機的某個固定端口便可。

•得到鏈接:當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也經過該鏈接進行數據交換。

•交換數據:當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也經過該鏈接進行數據交換。

•關閉鏈接:當服務器程序關閉時,須要關閉服務器端,經過關閉服務器端使得服務器監聽的端口以及佔用的內存能夠釋放出來,實現了鏈接的關閉。

•Java網絡編程技術

和網絡編程有關的基本API位於java.net包中,該包中包含了基本的網絡編程實現,該包是網絡編程的基礎。該包中既包含基礎的網絡編程類,也包含封裝後的專門處理WEB相關處理類。

一個基礎的網絡類——InetAddress類。該類的功能是表明一個IP地址,而且將IP地址和域名相關的操做方法包含在該類的內部。

•TCP編程

若是發送的一方發送的數據接收方以爲有問題,則網絡底層會自動要求發送方重發,直到接收方收到爲止。

在Java語言中,對於TCP方式的網絡編程提供了良好的支持,在實際實現時,以java.net.Socket類表明客戶端鏈接,以java.net.ServerSocket類表明服務器端鏈接。

•UDP編程

UDP(User Datagram Protocol),中文意思是用戶數據報協議,方式相似於發短信息,是一種物美價廉的通信方式,使用該種方式無需創建專用的虛擬鏈接。

網絡編程中也是這樣,必需要求可靠傳輸的信息通常使用TCP方式實現,通常的數據才使用UDP方式實現。

在Java API中設計的實現結構和TCP方式不太同樣。固然,須要使用的類仍是包含在java.net包中。

在Java API中,實現UDP方式的編程,包含客戶端網絡編程和服務器端網絡編程,主要由兩個類實現:

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

二、DatagramPacket類實現對於網絡中傳輸的數據封裝,也就是說,該類的對象表明網絡中交換的數據。在UDP方式的網絡編程中,不管是須要發送的數據仍是須要接收的數據,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的地址、發送到的端口號以及發送的內容等。

網絡協議

網絡協議是指對於網絡中傳輸的數據格式的規定。網絡協議的實質也是客戶端程序和服務器端程序對於數據的一種約定,只是因爲以計算機爲基礎,因此更多的是使用數字來表明內容,這樣就顯得比較抽象一些。

網絡協議就是一種格式上的約定,能夠根據邏輯的須要約定出各類數據格式,在進行設計時通常遵循「簡單、通用、容易解析」的原則進行。

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

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

網絡協議格式是該程序最核心的技術祕密,由於一旦協議格式泄漏,則任何一我的均可以根據該格式進行客戶端的編寫,這樣將影響服務器端的實現,也容易出現一些其它的影響。

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

首先關於IP地址和域的關係,並不太懂之間的聯繫,是IP包含域?仍是域包含IP地址?這塊的知識在計算機網絡上就存在些許的問題。我以爲這篇文章將IP地址和域比喻成手機號碼和手機通信錄名單,一我的能夠有不少個手機號碼,但是一個手機號碼只能有一我的對應。同理,一個域名能夠對應許多個IP地址,可是一個IP地址只能有一個IP地址。

•一樣的什麼是域?以前只是很簡單的講了域和IP地址的關係,可是域的具體定義卻沒有給出。百度後"域"的真正含義指的是服務器控制網絡上的計算機可否加入的計算機組合。

•是關於協議的問題,協議存在的具體做用是什麼?學習事後對於這個問題有了瞭解,協議的真正做用是一種格式,對於不一樣的電腦,不一樣的程序有不一樣的數據格式,而對於這種數據格式的規定就是協議。

代碼調試中的問題和解決過程

-首先操做關於java網絡類名操做

package cc.openhome;

        import java.net.*;

        public class InetAddressDemo {
        public static void main(String[] args) {
               try{
                        //使用域名建立對象
                        InetAddress inet1 = InetAddress.getByName("www.163.com");
                        System.out.println(inet1);
                        //使用IP建立對象
                        InetAddress inet2 = InetAddress.getByName("127.0.0.1");
                        System.out.println(inet2);
                        //得到本機地址對象
                        InetAddress inet3 = InetAddress.getLocalHost();
                        System.out.println(inet3);
                        //得到對象中存儲的域名
                        String host = inet3.getHostName();
                        System.out.println("域名:" + host);
                        //得到對象中存儲的IP
                        String ip = inet3.getHostAddress();
                        System.out.println("IP:" + ip);
               }catch(Exception e){}
        }
    }

關於這段代碼,是按照學習材料上操做過來的,可是最開始顯示失敗了,後來又仔細看學習材料,java這個網絡InetAddress類必須有網絡的鏈接纔可使用。

•關於TCP編程鏈接部分,以java.net.Socket類表明客戶端鏈接,以java.net.ServerSocket類表明服務器端鏈接。因此創建客戶端網絡鏈接,也就是建立Socket類型的對象,該對象表明網絡鏈接。

Socket socket1 = new Socket(「192.168.1.103」,10000);
 Socket socket2 = new Socket(「www.blog.com」,80);

關於這段代碼,socket1實現的是鏈接到IP地址是192.168.1.103的計算機的10000號端口,而socket2實現的是鏈接到域名是www.blog.com的計算機的80號端口,若是創建鏈接時,本機網絡不通,或服務器端程序未開啓,則會拋出異常。

•關於如何複用Socket鏈接?經過看纔料後,其實很簡單,創建鏈接之後,將數據交換的邏輯寫到一個循環中就能夠了。這樣只要循環不結束則鏈接就不會被關閉。
package tcp;
import java.io.;
import java.net.;

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數組中的數據按照順序發送給服務器端了。就能夠實現複用Socket鏈接。

結對及互評

點評過的同窗博客和代碼

評分標準

  1. 正確使用Markdown語法(加1分):
    • 不使用Markdown不加分
    • 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  2. 模板中的要素齊全(加1分)
    • 缺乏「教材學習中的問題和解決過程」的不加分
    • 缺乏「代碼調試中的問題和解決過程」的不加分
    • 代碼託管不能打開的不加分
    • 缺乏「結對及互評」的不能打開的不加分
    • 缺乏「上週考試錯題總結」的不能加分
    • 缺乏「進度條」的不能加分
    • 缺乏「參考資料」的不能加分
  3. 教材學習中的問題和解決過程, 一個問題加1分

  4. 代碼調試中的問題和解決過程, 一個問題加1分

  5. 本週有效代碼超過300分行的(加2分)
    • 一週提交次數少於20次的不加分
  6. 其餘加分:
    • 週五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進狀況的加1分
    • 有動手寫新代碼的加1分
    • 課後選擇題有驗證的加1分
    • 代碼Commit Message規範的加1分
    • 錯題學習深刻的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 結對學習狀況真實可信的加1分
  7. 扣分:
    • 有抄襲的扣至0分
    • 代碼做弊的扣至0分
    • 遲交做業的扣至0分

其餘(感悟、思考等,可選)

這周是學習的內容是學習網絡編程,已經到了java語言運用的地方了,不少知識點在其餘的課堂上有接觸,但發現仍是有不足,這周的代碼更多的主要仍是學習材料裏的代碼進行操做,本身的動手編譯程序的水平還欠缺一點。雖然到了java運用的時候,但仍是要把握好java語言基本的知識點,這纔是最重要的。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第五週 107/200 1/2 12

參考資料

相關文章
相關標籤/搜索