201521123091 《Java程序設計》第13周學習總結

Java 第十三週總結

第十三週的做業。
html

目錄
1.本章學習總結
2.Java Q&A
3.碼雲上代碼提交記錄及PTA實驗總結
4.課後閱讀java


1.本章學習總結

1.1 以你喜歡的方式(思惟導圖、OneNote或其餘)概括總結網絡相關內容。
下文來自與Java核心技術,有不少零散的知識點:正則表達式

  1. 鏈接到服務器:運行在遠程計算機上的服務器軟件不停地等待那些但願與相應端口鏈接的網絡請求。當遠程計算機上的操做系統接收到一個請求與相應端口鏈接的網絡數據包時,它便喚醒正在監聽網絡鏈接請求的服務器進程,併爲二者創建鏈接。這種鏈接還一直保持下去,直到被其中任何一方停止。
  2. GET / HTTP/1.0能夠返回一個HTML格式的文本頁,與Web瀏覽器訪問某個網頁所經歷的過程是徹底一致的,它是用HTTP從服務器請求Web頁面。
  3. 套接字是網絡軟件中的一個抽象概念,負責使能該程序內部和外部之間的通訊。
  4. Java平臺還支持所謂的UDP(用戶數據報協議),該協議能夠用於發送數據包,它所需付出的開銷要比TCP少得多。UDP還有一個重要的缺點:數據包無需按照順序進行傳遞,它們甚至可能在傳輸過程當中所有丟失。
  5. 因特網地址是指用一串數字表示的主機地址,它由4個字節組成,IPv6規定爲16個字節。一些訪問量較大的主機名一般會對應於多個因特網地址,以實現負載均衡。
  6. 服務器發送給服務器輸出流的全部信息都會成爲客戶端程序的輸入,同時來自客戶端程序的全部輸出都會被包含在服務器輸入流中。
  7. URL(統一資源定位符),URI(統一資源標識符),URN(統一資源名稱),URI是個純粹的句法結構,用於指定標識Web資源的字符串的各個不一樣部分。URL是URI的一個特例,它包含了用於定位Web資源的足夠信息。其餘URI則不屬於定位符,由於根據該標識符咱們沒法定位任何數據,也稱之爲URN。

2.Java Q&A

1. 網絡基礎

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

耗時不一樣,由於210.34.128.152在福建廈門,上圖183.232.231.173在廣東廣州,距離近,耗時短。數據庫

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

23
編程

1.3 telnet cec.jmu.edu.cn 80,嘗試回答:你從屏幕看到一些什麼內容?返回的內容是否是cec.jmu.edu.cn的主頁內容?嘗試使用GET /index HTTP/1.0命令,會返回什麼?


並非,啥都沒有小程序


返回主頁的網頁源代碼瀏覽器

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

QQ 使用8080端口 183.192.196.210來自上海市上海市 移動服務器

8080端口同80端口,是被用於WWW代理服務的,能夠實現網頁瀏覽,常常在訪問某個網站或使用代理服務器的時候,會加上「:8080」端口號。網絡

firefox 都是使用80端口
80端口是爲HTTP開放的
223.202.6.26來自北京市朝陽區 BGP多線
這個BGP多線??
還有183.250.178.82來自福建省廈門市 移動
蝦米音樂 113.18.220.108來自福建省福州市 移動多線程

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

IP、端口、域名、協議


2. 編寫TCP客戶端程序

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



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

大體類似,就是有些多是顏色控制符不能解析出來


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

由於沒有發送get請求獲取html文檔


必定要再加個newline,由於咱們輸入GET / HTTP/1.0後,要連續敲兩次回車。


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

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

2.1演示過了


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

啓動兩個線程,一個線程用來接受信息,一個線程用來發送信息


2.6 選作:實現2.5


忘記加服務器本身發的消息沒有在服務器端顯示,這個加一句輸出就行了。


3. ServerSocket與TCP服務器

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


3.2 多線程MenuServer。



4. UDP服務器

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



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

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

socket的輸入輸出流是字節流,而後用字符流來包裝。

Java網絡編程與流之間的關係:

Java programs see network connections as streams of data that can be interpreted and responded to in any way necessary.

好比文件傳輸:
首先發送端從本地文件系統中讀取文件,而且建立和接收端的網絡鏈接,而後發送端提供數據包裝器,而且把文件寫入這個包裝器中,而後寫到網絡中。接收端創建新文件,鏈接發送端,經過網絡接收到數據並進行解包,將數據寫到緩衝區中,最後從緩衝區寫到本地新建的文件中去。這其中數據都是以字節流的形式來保存的。


6. 代碼閱讀

閱讀ServerAndThread目錄中的源代碼

6.1 運行該程序(截圖)。簡述這個程序的主要功能。


主要功能就是客戶端與服務端之間的通訊

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

ClientChart:設置客戶端界面
ClientReadThread:客戶端讀取線程
ClientListener:客戶端的監聽器

服務端同理可得

MainThread:啓動服務端;監聽到客戶端鏈接後,加入客戶端的列表中;啓動服務端讀取線程

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

  • 服務端發送的信息在客戶端中沒有和客戶端本身發送的消息區分開來
    就本身發送的時候註明一下,分開來就行了
  • 服務端的輸出沒有另起一行
    那就加個換行符……
  • 還有就是本身會被再發一遍消息
    就是遇到同一客戶端即跳過


7. 網絡爬蟲

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

改爲3了,5跑的過久……





3.碼雲上代碼提交記錄

題目集:多線程(4-4到4-10)

3.1 碼雲代碼提交記錄

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


4. 課外閱讀

4.1 Java Tutorial:Custom Networking

Networking Basics
在網上運行的電腦都是用TCP和UDP來進行互相通訊的。當咱們寫網絡程序的時候,都是在應用層上操做。通常來講,咱們都不用關心TCP和UDP層。可使用java.net包。這些類提供獨立於系統地網絡通訊。
TCP:
當兩個應用想可靠地和對方聯繫,他們會創建聯繫並在這個鏈接上收發數據。這就像是打電話。TCP保證從鏈接一端發送的數據均可以到達另外一端,而且都會按照發送的順序接收到。不然,就會報錯。
TCP爲須要可靠聯繫的應用提供點對點的通道。HTTP,FTP和Telnet都是這樣的例子。數據收發的順序對於這些應用來講是很重要的。當HTTP用來從URL上讀取數據的時候,數據就必須按照發送的順序接收。不然,就會收到混亂的HTML文件,崩潰的壓縮文件或者是無效的信息。
UDP:
UDP的通訊是不能保證的。它從一個應用發送數據包,datagrams到另外一個應用。發送數據包就像是經過郵寄服務送信:順序是不重要的,也不能保證。
有些通訊是不須要那麼嚴格的標準的。事實上,可能由於可靠通訊所產生的額外費用致使服務無效。
好比對於時鐘服務來講,數據包丟了,再發一次是沒有道理的,由於客戶第二次收到的時候,時間已經不對了。若是客戶發出兩次請求,而且收到了無序的數據包,這並不重要,由於客戶能夠本身分辨出來而後再發一次請求。TCP在這種場合是毫無必要的,並且會致使時鐘服務無效。另外一個例子就是ping命令,這邊不作贅述。
總的來講,一臺主機只有一個物理鏈接。全部數據都經過這個鏈接到特定的電腦。然而,數據可能會出於不一樣的目的在這臺主機上運行。因此電腦要想知道是什麼應用發送的數據,就用經過使用端口。
在網上傳輸的數據都會帶上主機的地址信息還有目的端口。主機由32位的IP地址來指定,IP地址能夠用來將數據準確的送到網上的某臺主機上。端口就是一個16位的數字,TCP和UDP就能夠送到正確的程序上。

URL:
URL是統一資源定位的縮寫,是網上資源的引用。咱們能夠向Web瀏覽器提供URL來定位網上的文件,就像是在信上提供地址,郵局才能知道往哪邊寄。
Java的Internet程序會用到URL來尋找想要訪問的網上資源。可使用java.net中的URL類來表示一個URL地址。

Socket:
URL和URLConnections提供相對高級的機制來訪問網上的資源。有時程序須要使用低級的網絡通訊。
例如,服務端提供一些服務,好比處理數據庫的訪問和發送最新的股價。客戶使用服務端提供的服務,顯示數據庫的查詢結果或者說向投資者提供股票購買推薦意見。兩方的通訊必須是可靠的。數據不能丟失,並且必須按照服務端發送的順序到達客戶端。每一個程序都會綁定一個socket在鏈接的末端。爲了通訊,客戶端和服務端都要從socket中讀取或者是寫入。

Datagrams
一些應用是不須要TCP提供的可靠的、點對點的通道來通訊。這時候就可使用UDP來進行通訊。
UDP提供一種網絡通訊的模式,應用是發送數據包的,就是datagram。datagram是獨立的,是否到達,到達時間和內容都是無法保證的。Java提供了相應的類,即DatagramPacket和DatagramSocket。

4.2 HTTP協議簡介

服務器把網頁給瀏覽器,就是把網頁的HTML代碼給瀏覽器,而後 讓它顯示出來而已。瀏覽器和服務器之間的傳輸協議就是HTTP。

  • HTML是用來寫網頁的
  • HTTP是在網絡上傳輸HTML的協議

GET / HTTP/1.1:
GET表示一個讀取請求,將從服務器得到網頁數據,1.1是HTTP協議的版本,大部分服務器也支持1.0版本。
瀏覽器依靠Content-Type來判斷響應的內容所屬的類型。
當瀏覽器讀取到HTML源碼後,它會解析HTML,顯示頁面,而後,根據HTML裏面的各類連接,再發送HTTP請求給服務器,得到相應資源。

4.3 一個簡單的小爬蟲

FileReader類:
用來讀連接文件(存放商品的連接),而後getLines()能夠返回一個存放Url的列表。
Url類:
getConnection()用來得到連接,返回URLConnection類型
getReader()用來得到連接的輸入流
isExist()用來判斷是否含有相應字符串,在該程序中就是用來判斷是否含有free_msg字符串,即金子商品,若是有,則返回真。具體實現即用BufferedReader按行讀取。
Digger類:
這個類繼承Thread類,每讀入一個連接,就開啓一個線程,查看是否有相應字符串,若是有的話,就用IE來打開連接
Runtime.getRuntime().exec("C:/Program Files/Internet Explorer/iexplore.exe " + url.getUrl());

相關文章
相關標籤/搜索