201521123006 《java程序設計》 第13周學習總結

1. 本週學習總結

1.以你喜歡的方式(思惟導圖、OneNote或其餘)概括總結多網絡相關內容。

2. 書面做業

1. 網絡基礎

1.1 比較ping www.baidu.comping cec.jmu.edu.cn,分析返回結果有何不一樣?爲何會有這樣的不一樣?

不一樣在於:javascript

  • 他們的IP不一樣,ping www.baidu.com爲:163.177.151.110;ping cec.jmu.edu.cn爲:210.34.128.152。
  • 完成一次網絡交互的時間不一樣,ping www.baidu.com爲:19ms完成一次網絡交互;ping cec.jmu.edu.cn爲:小於等於1ms完成一次網絡交互。
  • TTL的值不一樣,ping www.baidu.com爲:51,中間通過了13個網絡設備;ping www.baidu.com爲:61,表示中間通過了3個網絡設備。
  • 返還行程的時間不一樣,ping www.baidu.com爲:最短19ms,最長19ms,平均19ms; ping cec.jmu.edu.cn爲:最短0ms,最長1ms,平均0ms。

由於IP地址: 163.177.151.110在廣東省廣州市 聯通,而IP地址:210.34.128.152在福建省廈門市 教育網。而210.34.128.152離咱們的距離更近,因此它的速度更快,進過的網絡設備更少,本質上是由於他們的IP地址不一樣。html

1.2 telnet bbs.newsmth.net,上面這條命令鏈接的是遠程主機的什麼端口號?

這條命令鏈接的是遠程主機的23端口號。java

1.3 telnet cec.jmu.edu.cn 80,嘗試回答:你從屏幕看到一些什麼內容?返回的內容是否是cec.jmu.edu.cn的主頁內容?嘗試使用GET /index HTTP/1.0命令,會返回什麼?詳見實驗任務書題目1。

  • 沒有如何結果,因此返回的內容不是cec.jmu.edu.cn的主頁內容。

  • 會返回cec.jmu.edu.cn的主頁代碼。

1.4 啓動ConnectionWatcher, 而後啓動若干個能夠聯網的程序(如QQ, telnet,瀏覽器等),查看本機上有什麼程序聯網,使用了什麼端口?QQ佔用了什麼端口和那些遠程IP進行交互,這些IP分佈地在那裏?使用了什麼協議進行通訊?

  • 360程序聯網,使用了80端口。
  • UC瀏覽器聯網,使用了80端口。
  • 搜狐新聞聯網,使用了80端口。

  • QQ使用了80,443端口和那些遠程IP進行交互,這些IP分佈地:例如:183.61.38.217來自廣東省深圳市 電信,110.81.153.148來自福建省泉州市 電信等。使用了TCP協議和UDP協議進行通訊。

1.5 編寫網絡程序必不可少的幾個信息是什麼?

  • 參考:實驗任務書-題目1

編寫網絡程序必不可少的幾個信息是:正則表達式

  • 套接字,即須要掌握和了解應用程序和網絡協議的接口。
  • TCP協議和UDP協議的掌握和使用。
  • 以及須要瞭解IP,端口,域名等基礎知識。

2. 編寫TCP客戶端程序

2.1 參照SocketTest.java編寫一個簡單的鏈接遠程服務器小程序Client.java,能夠接收並顯示服務器發送的信息。啓動時須要首先在控制檯指定遠程主機IP與端口號。(截圖,出現本身學號)

2.2 將程序中的網址改爲bbs.newsmth.net,端口號改成23,再次觀察返回結果?嘗試執行telnet bbs.newsmth.net 23,對比返回結果。

兩個返回結果基本上是一致的,只是eclipse上有的字符不可以識別,不能顯示出來。編程

2.3 將程序中的網址改爲cec.jmu.edu.cn,端口號改成80進一步觀察返回結果。沒有任何返回結果,爲何?怎麼操做?

  • 由於只是輸入了網址和端口號,並無使用GET / HTTP/1.0發出讀取請求,來得到此網頁的數據,因此沒有任何返回結果。
  • 再添上GET / HTTP/1.0就好了。

2.4 啓動網絡調試助手,將其設置爲TCP Server,並啓動,以下圖所示

嘗試使用Client.java鏈接該TCP Server,使用該服務器向Client發送信息。(截圖)

2.5 回答:如今的Client.java只能接收信息,可否改造Client.java使其能夠與服務器進行交互(服務器能夠發送信息給Client,Client也可發送信息給服務器),寫出大概思路便可。

使用Socket中的getOutputStream類,並對其進行包裝,可使用PrintWriter類,由於其輸出的是字符文本。而且是從客戶端輸入到服務器端,因此咱們就可使用Scanner類,在控制檯輸入,並使用println輸出到服務器端。最後由於PrintWriter類有使用到緩衝區,這時就須要咱們使用flush()釋放緩衝區。小程序

2.6 選作:實現2.5

  • 參考:實驗任務書-題目2

3. ServerSocket與TCP服務器

3.1 簡易單線程MenuServer,題目3.1-3.4。(關鍵代碼及運行截圖,包含學號)可使用網絡調試助手,將其設置爲TCP Client(IP與端口填你的MenuServer的IP與端口),鏈接你的MenuServer。其中的文件搜索功能爲選作。

3.2 多線程MenuServer(截圖證實你這個是多線程服務器,使用telnet鏈接)。

3.3 選作:圖形界面的MenuServer

  • 能夠控制服務器的啓動中止、查看客戶端連接的基本信息(IP、端口、連接時間)
  • 拓展:在服務器端斷開某個客戶端的連接、查看客戶端發送的給服務器端的日誌記錄
  • 參考:實驗任務書-題目3
  • 參考:EchoServer.java,ThreadedEchoServer.java (多線程服務器)

4. UDP服務器

4.1 改造3.1或3.2,將其改形成基於UDP的MenuServer。(運行界面代碼截圖,包含學號)。可使用網絡調試助手,將其設置爲UDP,要填本機IP與端口也要填遠程服務器的IP與端口。

  • 參考:UDPServer.java

5.論述題: 網絡程序與流

5.1 前面編寫的程序用到了大量的流的相關知識。簡述,編寫網絡程序時應當選擇什麼樣的流?Java網絡編程、流之間的關係。場景如:簡單的文字聊天、文件傳輸、應用層協議服務器,如QQ、聊天室、網絡遊戲。

  • 編寫網絡程序時應當選擇可以進行數據交換的流或者是與程序相關的流。例如:當咱們進行簡單的文字聊天時,咱們應該選擇輸入流和輸出流對咱們之間的交流文字進行交換,已達到咱們之間可以進行交流的目的。此時的輸入流和輸出流是字節流,再用字符流包裝。
  • Java網絡編程、流之間的關係:例如:咱們使用java進行客戶端的編程,咱們使用Socket套接字創建客戶端對象,當客戶端對象創建後,則完成了客戶端編程的第一步,緊接着的步驟就是按照「請求-響應」模型進行網絡數據交換,在Java語言中,數據傳輸功能由Java IO實現,也就是說只須要從鏈接中得到輸入流和輸出流便可,而後將須要發送的數據寫入鏈接對象的輸出流中,在發送完成之後從輸入流中讀取數據便可。因此,咱們能夠認爲流是用來解決java網絡編程中的數據交換問題的,用來進行網絡數據交換。

6. 代碼閱讀

閱讀ServerAndThread目錄中的源代碼 **瀏覽器

6.1 修改程序,在GUI界面中某個地方顯示本身的學號,而後運行該程序(截圖、出現學號)。簡述這個程序的主要功能。

這個程序的主要功能就是服務端和客戶端之間的交流或者說是他倆之間的通訊。服務器

6.2 畫出源代碼的結構圖(各個類的依賴關係)。並簡要說明各個類的功能。

功能
ServerChart 設置服務端的顯示界面
ServerReadThread 服務端讀取線程
SeverActionListener 監聽服務端
MainThread 創建鏈接;監聽到客戶端鏈接後,把線程放到列表中;服務端讀取線程
ClientChart 設置客戶端的顯示界面
ClientReadThread 客戶端讀取線程
ClientListener 監聽客戶端

6.3 簡述這個程序有什麼不足之處及改進方法.

  • 不足之處:客戶端發送到服務器的消息並不能區分出是哪一個服務器發的。服務器發送的消息不可以換行,會和下一則客戶端消息合併到一塊兒。
  • 改進方法:若是信息中不包含標記的字符串就加上「服務端說:」,這樣就能夠區分哪一個是服務端發的了。在服務端顯示消息的那行代碼上添上換行符就好了。

選作:7. 網絡爬蟲

使用Socket、URL、正則表達式、流等編寫一個網絡爬蟲能夠將cec.jmu.edu.cn及其所包含連接上的全部網址的圖片都下載下來,抓取深到不超過5。

選作:8. 簡易搜索引擎(進階)

8.1 寫出設計思路便可。該搜索引擎包含幾部分?裏面核心的實現思路?若是能用框架圖、流程圖畫出架構

8.2 以計算機學院網站爲例,進行測試。好比,輸入ACM後搜索,能夠將包含ACM的的網頁抽取出來。(可做爲課程設計題目)

3. 碼雲

3.1 碼雲代碼提交記錄

  • 在碼雲的項目中,依次選擇「統計-Commits歷史-設置時間段」, 而後搜索並截圖

4. 課外閱讀

4.1 Java Tutorial:Custom Networking

Trail: Custom Networking

主要看Overview of Networking,Working With URLs,All About Sockets,All About Datagrams

  • Overview of Networking:其有兩部分,首先,描述了Java平臺的網絡功能,其次咱們須要瞭解如何使用URLs,sockets和datagrams。咱們從網絡中下載applet,此時運行的程序中引用了一個特殊的標記——一個HTML文件的 標籤。applet能夠定位在任何地方,瀏覽器經過解碼 標籤來定位applet並運行它。在java程序中,咱們可使用URL來引用,甚至是鏈接網絡上的資源。電腦在互聯網上的交互使用傳輸控制協議(TCP)和用戶數據報協議(UDP),TCP是須要創建鏈接的,它是可靠的,有序的,例如:HTTP,FTP,Telnet都是基於TCP的經常使用應用,而UDP則不須要創建鏈接,它提升了通訊不保證網絡。通常來講,一臺電腦只有一個物理鏈接到網絡,這時候咱們就須要使用端口來區別數據屬於計算機中的那個程序。在java車程序中,咱們通常經過類java.net使得Java程序可使用TCP或UDP在互聯網上進行交流。

  • Working With URLs: URL是統一資源定位符的縮寫,它能夠指在Java程序中的一個網絡地址或一個URL對象。網址是指一個URL的字符串描述如何在互聯網上找到一個資源,其有兩個主要組件:協議標識符和資源名稱。當咱們須要在java程序中建立一個URL對象時,咱們可使用URL myURL = new URL("http://example.com/");來建立,其表明了一個絕對URL,會拋出MalformedURLException異常。一些URL地址有可能會包含特殊字符,例如空格字符:http://example.com/hello world/,使用URL:URL url = new URL("http://example.com/hello%20world");,一個空格符會須要幾個符號來表示,很不方便,這時候就須要使用java.net.URI類,URI uri = new URI("http", "example.com", "/hello world/", "");,而後將URI轉爲URL:URL url = uri.toURL();
  • URL的一些方法:
  • getProtocol
        返回URL的協議名稱。
    getAuthority
        返回URL的受權部分。
    getHost
        返回URL的主機名稱。
    getPort
        返回URL的端口號。getPort方法返回端口號。若是未設置端口,getPort返回-1。
    getPath
        返回URL的路徑部分。
    getQuery
        返回URL的查詢部分。
    getFile
        返回此URL的文件名。返回的文件部分將與getPath()相同,再加上getQuery()值的規範化形式(若是有)。若是沒有查詢部分,此方法和getPath()將返回相同的結果。
    getRef
        返回URL的錨點(也稱爲「引用」)。
    • All About Sockets:socket是在網絡上進行雙向溝通的兩個程序的一個端點。socket類是用於表示客戶端程序和服務器程序之間的聯繫。客戶端的程序編寫:首先,使用一個套接字創建對象;而後使用對應的輸入流和輸出流;再根據服務器的協議進行讀取和寫入到流;最後關閉流,關閉套接字。服務器的編程則是使用ServerSocket serverSocket = new ServerSocket(portNumber);創建一個服務器對象,clientSocket = serverSocket.accept();則是等待客戶端啓動和請求鏈接這個服務器的主機和端口,創建二者之間的關係。網絡

    • All About Datagrams:datagram是一個獨立的、經過網絡發送自包含信息的,到達時間和內容是沒有保證的。在java.net包中咱們可使用類DatagramSocket,DatagramPacket,MulticastSocket來發送和接受datagram。編寫服務器程序是咱們可使用類QuoteServer和類QuoteServerThread。而客戶端則是使用類QuoteClient。類MulticastSocket可使得服務器廣播到多個客戶端,而不是隻有特定額客戶端。

    4.2 HTTP協議簡介

    • 在Web應用中,服務器把網頁傳給瀏覽器,實際上就是把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。而瀏覽器和服務器之間的傳輸協議是HTTP。
    • HTML是一種用來定義網頁的文本,對於編寫網頁有很大的幫助或者是做用。
    • HTTP是在網絡上傳輸HTML的協議,用於瀏覽器和服務器的通訊。
    • GET / HTTP/1.1是用來發出一個讀取請求,用來使服務器可以得到此網頁的數據,也可使用GET / HTTP/1.0,只是相對於1.0版本,1.1版本容許多個HTTP請求複用一個TCP鏈接,傳輸速度會比1.0版本快。固然,除了GET外,咱們還可使用POST。二者的區別在於:GET僅請求資源,而POST會附帶用戶數據。
    • Host: www.sina.com.cn是服務器能夠經過Host來區分瀏覽器請求的是哪一個網站。
    • HTTP響應分爲Header和Body兩部分(Body是可選項)。Header:例如:200 OK:200表示一個成功的響應,後面的OK是說明。而失敗的響應有404 Not Found:網頁不存在,500 Internal Server Error:服務器內部出錯。
    • Content-Type: text/html:指示響應的內容。瀏覽器是依靠Content-Type來判斷響應的內容,並非靠URL來判斷響應的內容。
    • HTTP響應的Body就是HTML源碼。
    • 每一個Header都自成一行,換行符是\r\n。當遇到連續兩個\r\n時,則Header部分結束,後面的數據所有是Body,而且其數據類型由Content-Type來肯定。
    • 使用了Content-Encoding時,Body數據是被壓縮的,這就須要咱們先對其進行解壓。

    4.3 一個簡單的小爬蟲

    Java編程技巧:小爬蟲程序.docx

    • 使用流進行讀取連接文件:reader = new BufferedReader(new InputStreamReader(new FileInputStream(this.fileName)));,再將讀取出的數據添加到列表中:lines.add(line).
    • 使用URL來得到所需的連接:URLConnection conn= httpUrl.openConnection();,再獲取連接上的輸出流,這時候就須要在URL類的基礎上使用流:br = new BufferedReader(new InputStreamReader(conn.getInputStream()));,最後,咱們想要檢查輸出流中是否含有標記字符串:
    while ( (line = bis.readLine()) != null) { 
      exist = line.contains(str); 
      if(exist) { 
          break; 
      } 
    }
    • 使用流將文件讀入程序,並寫入列表,爲每個連接開啓一個線程:
    FileReader reader = new FileReader("F:/myworkspace/workspace/diggold/src/url.txt"); 
      List urls = reader.getLines(); 
      for (String string : urls) { 
          Url url = new Url(string); 
          Digger digger = new Digger(url); 
          digger.start(); 
      } 
    • 而後查看是否有free_msg字段,有就打開連接:
    if(url.isExist("free_msg"))
        Runtime.getRuntime().exec("C:/Program Files/Internet Explorer/iexplore.exe " + url.getUrl()); 

    4.4 進階:HTTPComponent的使用

    使用java中的Socket、URL、URLConnection,而後遵循HTTP協議也能夠編寫一個小程序,和能夠查詢成績的HTTP服務器進行交流。然而直接使用Socket編程較麻煩,這時候咱們可使用HTTPComponent。
    HTTPComponent相比傳統JDK自帶的URLConnection,增長了易用性和靈活性

    1. 閱讀HttpClient 教程,使用HTTPComponent編寫一些與HTTP服務器交換的示例程序

    2. 選作:使用HTTPComponent開發一個查詢成績的程序:用戶輸入用戶名、密碼、驗證碼,便可自動查詢教務處服務器,獲取成績。

    • 參考資料:用Java的HttpClient寫一個簡單的http請求和返回,HttpClient使用詳解,HttpClient 教程, HTTP Client官網
    posted @ 2017-05-21 15:15 xwp 閱讀( ...) 評論( ...) 編輯 收藏
    markdown

相關文章
相關標籤/搜索