1. 本週學習總結

以你喜歡的方式(思維導圖、OneNote或其他)歸納總結多網路相關內容。


 

2. 書面作業

1. 網路基礎

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

C:\Users\Creator>ping www.baidu.com

正在 Ping www.a.shifen.com [14.215.177.37] 具有 32 字
來自 14.215.177.37 的回覆: 位元組=32 時間=16ms TTL=53
來自 14.215.177.37 的回覆: 位元組=32 時間=16ms TTL=53
來自 14.215.177.37 的回覆: 位元組=32 時間=16ms TTL=53
來自 14.215.177.37 的回覆: 位元組=32 時間=17ms TTL=53

C:\Users\Creator>ping cec.jmu.edu.cn
正在 Ping jmuweb2.jmu.edu.cn [222.76.205.136] 具有 32 位元組的資料:
來自 222.76.205.136 的回覆: 位元組=32 時間=2ms TTL=54
來自 222.76.205.136 的回覆: 位元組=32 時間=2ms TTL=54
來自 222.76.205.136 的回覆: 位元組=32 時間=2ms TTL=54
來自 222.76.205.136 的回覆: 位元組=32 時間=2ms TTL=54

您查詢的 IP:14.215.177.37

所在地理位置:廣東省廣州市 電信

您查詢的 IP:222.76.205.136

所在地理位置:福建省廈門市 電信

從結果來看,ping cec.jmu.edu.cn比ping www.baidu.com包的傳輸時間更短,因為cec.jmu.edu.cn的伺服器離我們更近。

但是為什麼ping cec.jmu.edu.cn的結果會變成ping jmuweb2.jmu.edu.cn [222.76.205.136] 呢?推測原因,首先,這應該是使用了CNAME解析,即cec.jmu.edu.cn和ping jmuweb2.jmu.edu.cn是同一臺主機222.76.205.136。在瀏覽器上輸入這個ip地址後進入了集美大學網上辦事大廳,輸入jmuweb2.jmu.edu.cn也是進入集美大學網上辦事大廳的主頁面,但是輸入cec.jmu.edu.cn卻是進入了計算機工程學院的主頁,原因應該是在222.76.205.136的主機上存在對cec.jmu.edu.cn的DNS解析條目吧。

1.2 telnet bbs.newsmth.net,上面這條命令連線的是遠端主機的什麼埠號?

ping bbs.newsmth.net檢視其ip地址:
正在 Ping alibj1-lbs1.newsmth.net [101.200.29.164] netstat -ano 命令檢視其對於的埠號為23.
192.168.1.101:4699 101.200.29.164:23 ESTABLISHED

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

沒有任何返回結果
//顯示的並不是cec.jmu.edu.cn的主頁內容 使用命令GET /index HTTP/1.0後,返回主頁原始碼。

1.4 啟動ConnectionWatcher, 然後啟動若干個可以聯網的程式(如QQ, telnet,瀏覽器等),檢視本機上有什麼程式聯網,使用了什麼埠?QQ佔用了什麼埠和那些遠端IP進行互動,這些IP分佈地在那裡?使用了什麼協議進行通訊?

cloudMusic,qq等程式在執行。有443(https),80(http)埠。使用TCP協議。如119.145.235.91在廣東省深圳市 電信。

1.5 編寫網路程式必不可少的幾個資訊是什麼?

套接字(IP+埠) 使用TCP還是UDP協議,輸入輸出流。

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進一步觀察返回結果。沒有任何返回結果,為什麼?

	try
{
Socket s = new Socket("cec.jmu.edu.cn", 80);
try
{
OutputStream outStream = s.getOutputStream();
InputStream inStream = s.getInputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true);
out.println("GET / HTTP/1.0\n");
while (in.hasNextLine())
{
String line = in.nextLine();
System.out.println(line);
}
}
finally
{
s.close();
}
//201521123076
}
catch (IOException e)
{
e.printStackTrace();
}

我們用瀏覽器登入某個網站的時候,一般瀏覽器會預設幫我們傳送一個GET請求命令,請求index檔案,從而展示出初始頁面。而這裡我們只是建立了套接字連線到遠端主機,並沒有向其傳送任何請求,所以沒有任何返回結果,使用"GET / HTTP/1.0\n"(需要加換行)傳送一個HTTP請求報文就有返回結果了。

2.4 啟動網路除錯助手,將其設定為TCP Server,並啟動,如下圖所示,嘗試使用Client.java連線該TCP Server,使用該伺服器向Client傳送資訊。(截圖)

2.5 回答:現在的Client.java只能接收資訊,能否改造Client.java使其可以與伺服器進行互動(伺服器可以傳送資訊給Client,Client也可傳送資訊給伺服器),寫出大概思路即可。

3. ServerSocket與TCP伺服器

3.1 簡易單執行緒MenuServer,題目3.1-3.4。(關鍵程式碼及執行截圖,包含學號)可以使用網路除錯助手,將其設定為TCP Client(IP與埠填你的MenuServer的IP與埠),連線你的MenuServer。其中的檔案搜尋功能為選做?

執行TCP服務端,開啟網路除錯助手,填寫8190埠號並連線;

進入選單,獲取伺服器時間;

獲取本機ip地址及埠號 ;

利用上次寫的FindFile,稍作修改,將找到檔案結果輸出到客戶端即可。(把G:\Others當做伺服器中的檔案儲存位置);

3.2 多執行緒MenuServer。(截圖證明你這個是多執行緒伺服器,使用telnet連線)

4. UDP伺服器

4.1 改造3.1或3.2,將其改造成基於UDP的MenuServer。(執行介面程式碼截圖,包含學號)。可以使用網路除錯助手,將其設定為UDP,要填本機IP與埠也要填遠端伺服器的IP與埠。

//檔案查詢功能程式碼。

使用兩個客戶端通過UDP連線,UDPServer無需使用多執行緒,依然可以實現對每個客戶端回覆。

由第三題和第四題也可以看出UDP與TCP一個主要區別就是是否需要保持連線才能進行資料傳輸。

TCP是一個安全的協議,其需要經過三次握手建立連線,終端才能夠使用TCP協議進行通訊。可以理解為每個客戶端想與服務端建立連線,服務端都要為其開闢一個執行緒與其進行"一對一"的連線。

而UDP伺服器只需要監聽某個埠即可從中收到資料包,並不需要事先建立連線,也就不需要使用多執行緒了。

5. 論述題:網路程式與流

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

網路程式設計都是以位元組流為基礎,假如我們要傳輸文字資訊(如QQ聊天),那麼就可以把其封裝為字元流進行傳輸。那我們要使用檔案傳輸的話(比如傳輸一個.exe檔案),使用位元組流比較合適,當然,我們可以為其封裝為BufferedInputStream/BufferedOutputStream,使用緩衝區加快速度。

6. 程式碼閱讀

閱讀ServerAndThread目錄中的原始碼

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

簡易多人群聊模型。

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

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

1.伺服器傳送的訊息,也會顯示為客戶端說:...解決方法:使用flag,將伺服器傳送的訊息帶上標記。

2.客戶端成功連線服務端之後,如果服務端被關閉,那麼客戶端會一直不停地請求連線服務端,報Connection reset異常。或者客戶端被強制關閉,服務端也同樣會一直報Connection reset的異常。原因就是因為某一端的socket被關閉了,但是另一端任然在請求輸入流。

//客戶端
Object mgs = objectInPutStream.readObject();
//服務端
String mgs = objectin.readObject().toString();

解決方法:設定重連次數(3次)。

3. 碼雲

在碼雲的專案中,依次選擇“統計-Commits歷史-設定時間段”, 然後搜尋並截圖