20155219 2016-2017-2 《Java程序設計》第10周學習總結

20155219 2016-2017-2 《Java程序設計》第10周學習總結

教材學習內容總結

教材學習內容總結
Java的網絡編程html

網絡編程java

網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。
網絡概述git

1.計算機網絡概述程序員

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

(2)網絡最主要的優點在於共享:共享設備和數據,如今共享設備最多見的是打印機。數據庫

(3)IP地址:爲了可以方便的識別網絡上的每一個設備,網絡中的每一個設備的惟一的數字標識。如今命名IP地址的規定是IPv4協議,該協議規定每一個IP地址由4個0-255之間的數字組成,例如10.0.120.34。IP地址多是固定的,例如網絡上各類各樣的服務器;也能夠是動態的,例如使用ADSL撥號上網的寬帶用戶。編程

(4)域名(Domain Name):例如sohu.com等。一個IP地址能夠對應多個域名,一個域名只能對應一個IP地址。數組

(5)DNS服務器:在網絡中傳輸的數據,所有是以IP地址做爲地址標識,因此在實際傳輸數據之前須要將域名轉換爲IP地址,實現這種功能的服務器稱之爲DNS服務器,也就是通俗的說法叫作域名解析。瀏覽器

(6)端口(port):讓一個計算機能夠同時運行多個網絡程序,在同一個計算機中每一個程序對應惟一的端口。 在硬件上規定,端口的號碼必須位於0-65535之間,每一個端口惟一的對應一個網絡程序,一個網絡程序可使用多個端口。服務器

2.網絡編程概述

(1)網絡編程就是兩個或多個程序之間的數據交換。

(2)「請求-響應」模型:通信的一端發送數據,另一端反饋數據,網絡通信都基於該模型。 在網絡通信中,第一次主動發起通信的程序被稱做客戶端(Client)程序,簡稱客戶端,而在第一次通信中等待鏈接的程序被稱做服務器端(Server)程序,簡稱服務器。一旦通信創建,則客戶端和服務器端徹底同樣,沒有本質的區別。

(3)客戶端/服務器結構:也叫作Client/Server結構,簡稱C/S結構。優點:客戶端是專門開發的,根據須要實現各類效果;劣勢:通用性差,幾乎不能通用等,在實際維護時,也須要維護專門的客戶端和服務器端,維護的壓力比較大。

(4)覽器/服務器結構:也叫作Browser/Server結構,簡稱爲B/S結構。優點:開發的壓力比較小,不須要維護客戶端;劣勢:瀏覽器的限制比較大,表現力不強,沒法進行系統級操做等。B/S結構其實也就是一種特殊的C/S結構。

(5)P2P程序:是一種特殊的程序,既包含客戶端程序,也包含服務器端程序。使用客戶端程序部分鏈接其它的種子(服務器端),而使用服務器端向其它的BT客戶端傳輸數據。

(6)協議(Protocol):在實際進行數據交換時數據的格式。由於各個網絡程序之間協議格式的不一樣,致使了客戶端程序都是專用的結構。

3.網絡通信方式

(1)現有的網絡中,網絡通信的方式主要有兩種:

·TCP(傳輸控制協議)方式
·UDP(用戶數據報協議)方式
(2)TCP方式:使用該種方式進行網絡通信時,須要創建專門的虛擬鏈接,而後進行可靠的數據傳輸,若是數據發送失敗,則客戶端會自動重發該數據。重要的數據通常使用TCP方式進行數據傳輸。因爲TCP須要創建專用的虛擬鏈接以及確認傳輸是否正確,因此使用TCP方式的速度稍微慢一些,並且傳輸時產生的數據量要比UDP稍微大一些。

(3)UDP方式:使用這種方式進行網絡通信時,不須要創建專門的虛擬鏈接,傳輸也不是很可靠,若是發送失敗則客戶端沒法得到。大量的非核心數據則都經過UDP方式進行傳遞。
網絡編程技術

1.網絡編程步驟

(1)客戶端網絡編程步驟

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

(2)服務器端網絡編程步驟

一、 監聽端口:服務器端屬於被動等待鏈接,因此服務器端啓動之後,不須要發起鏈接,而只須要監聽本地計算機的某個固定端口便可。這個端口就是服務器端開放給客戶端的端口,服務器端程序運行的本地計算機的IP地址就是服務器端程序的IP地址。

二、 得到鏈接:當客戶端鏈接到服務器端時,服務器端就能夠得到一個鏈接,這個鏈接包含客戶端的信息,例如客戶端IP地址等等,服務器端和客戶端也經過該鏈接進行數據交換。通常在服務器端編程中,當得到鏈接時,須要開啓專門的線程處理該鏈接,每一個鏈接都由獨立的線程實現。

三、 交換數據:服務器端經過得到的鏈接進行數據交換。服務器端的數據交換步驟是首先接收客戶端發送過來的數據,而後進行邏輯處理,再把處理之後的結果數據發送給客戶端。簡單來講,就是先接收再發送,這個和客戶端的數據交換數序不一樣。其實,服務器端得到的鏈接和客戶端鏈接是同樣的,只是數據交換的步驟不一樣。固然,服務器端的數據交換也是能夠屢次進行的。在數據交換完成之後,關閉和客戶端的鏈接。

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

(3)TCP方式是須要創建鏈接的,對於服務器端的壓力比較大,而UDP是不須要創建鏈接的,對於服務器端的壓力比較小。

2.Java網絡編程技術

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

(2)InetAddress類:該類的功能是表明一個IP地址,而且將IP地址和域名相關的操做方法包含在該類的內部。

3.TCP編程

(1)TCP方式的網絡通信是指在通信的過程當中保持鏈接,只須要創建一次網絡鏈接,就能夠屢次傳輸數據。

(2)以java.net.Socket類表明客戶端鏈接,以java.net.ServerSocket類表明服務器端鏈接。程序員實際編程時,只須要指定IP地址和端口號碼就能夠創建鏈接了。

(3)客戶端網絡編程:首先須要創建鏈接,在Java API中以java.net.Socket類的對象表明網絡鏈接,因此創建客戶端網絡鏈接,也就是建立Socket類型的對象,該對象表明網絡鏈接,示例以下:

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

鏈接一旦創建,則完成了客戶端編程的第一步,緊接着的步驟就是按照「請求-響應」模型進行網絡數據交換,在Java語言中,數據傳輸功能由Java IO實現,也就是說只須要從鏈接中得到輸入流和輸出流便可,而後將須要發送的數據寫入鏈接對象的輸出流中,在發送完成之後從輸入流中讀取數據便可。示例代碼以下:

OutputStream os = socket1.getOutputStream(); //得到輸出流
InputStream is = socket1.getInputStream();     //得到輸入流

最後當數據交換完成之後,關閉網絡鏈接,釋放網絡鏈接佔用的系統端口和內存等資源,完成網絡操做,示例代碼以下:

socket1.close();

Java網絡編程技術:

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

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){}
    }
}

運行結果如圖:image
網絡協議

1.網絡協議是指對於網絡中傳輸的數據格式的規定。網絡協議的實質也是客戶端程序和服務器端程序對於數據的一種約定,使用數字來表明內容,進行設計時通常遵循「簡單、通用、容易解析」的原則進行。

2.在網絡編程中,對於同一個網絡程序來講,通常都會涉及到兩個網絡協議格式:客戶端發送數據格式和服務器端反饋數據格式,在實際設計時,須要一一對應。

3.客戶端程序和服務器端程序須要進行協議處理的代碼分別以下。

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

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

一、 服務器端反饋協議格式的生成
二、 客戶端發送協議格式的解析
4.對於一種網絡程序來講,網絡協議格式是該程序最核心的技術祕密。
網絡編程示例

1.質數判別示例

(1)程序功能

客戶端程序功能:

a) 接收用戶控制檯輸入

b) 判斷輸入內容是否合法

c) 按照協議格式生成發送數據

d) 發送數據

e) 接收服務器端反饋

f) 解析服務器端反饋信息,並輸出
服務器端程序功能:

a) 接收客戶端發送數據

b) 按照協議格式解析數據

c) 判斷數字是不是質數

d) 根據判斷結果,生成協議數據

e) 將數據反饋給客戶端
(2)協議格式

客戶端發送協議格式:

將用戶輸入的數字轉換爲字符串,再將字符串轉換爲byte數組便可。
客戶端發送「quit」字符串表明結束鏈接。
服務器端發送協議格式:

反饋數據長度爲1個字節。數字0表明是質數,1表明不是質數,2表明協議格式錯誤。

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

  • 問題1:

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

  • xx1問題:以下代碼:
import java.io.*;
import java.net.*;
public class SimpleSocketClient {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        //服務器端IP地址
        String serverIP = "127.0.0.1";
        //服務器端端口號
        int port = 10001;
        //發送內容
        String data = "Hello";
        try {
            //創建鏈接
            socket = new Socket(serverIP,port);
            //發送數據
            os = socket.getOutputStream();
            os.write(data.getBytes());
            //接收數據
            is = socket.getInputStream();
            byte[] b = new byte[1024];
            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) {}
        }
    }
}

運行時出現以下錯誤:image

  • xx1解決方案:將
int port = 10001;

改成

int port = 10000;

運行結果正確

  • xx問題2:以下代碼:
import java.io.*;
import java.net.*;
public class SimpleSocketClient {
    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 = "Hello";
        try {
            //創建鏈接
            socket = new Socket(serverIP,port);
            //發送數據
            os = socket.getOutputStream();
            os.write(data.getBytes());
            //接收數據
            byte[] b = new byte[1024];
            is = socket.getInputStream();
            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) {}
        }
    }
}

運行出以下錯誤:image

  • xx2解決方案
  • ...

代碼託管

  • 代碼提交過程截圖:
    • 運行 git log --pretty=format:"%h - %an, %cd : %s" 並截圖
  • 代碼量截圖:
    • 運行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 並截圖image

上週考試錯題總結

本週考試的內容是第二次實驗和數據庫創建,暫時沒有答案,還要繼續學習數據庫的知識。

評分標準

  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分

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx

  • 參考示例

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20155224
    • 結對照片image
    • 結對學習內容
      • 上週錯題的理解與掌握。
      • 第十五章教材學習中遇到的問題進行討論。
      • 第十五章代碼調試中遇到的問題進行討論。
  • 上週博客互評狀況
代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 120/120 1/4 16/16 開始了JAVA學習的第一步!
第二週 346/466 1/5 23/36 瞭解並學習了Java基礎語法
第三週 364/830 1/6 21/57 進一步瞭解java設計語句
第四周 570/1300 2/8 20/77 初步學習了繼承與多態,接口與多態知識。
第五週 1056/2356 1/9 23/100 瞭解Java的異常處理,學習Collection和Map架構
第六週 960/3100 1/10 22/122 瞭解串流設計和線程
第七週 427/3527 2/12 20/144 瞭解Java中的時間,完成第二次實驗
第八週 900/4400 1/13 20/164 初步瞭解了正則表達式
第九周 498/4950 2/15 20/184 初步學會使用MySQL
第十週 956/5000 1/16 20/204 初步學習了網絡編程

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

參考資料

相關文章
相關標籤/搜索