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

做業13-網絡


1.本週學習總結

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

2. 爲你的系統增長網絡功能(購物車、圖書館管理、鬥地主等)-分組完成

爲了讓你的系統能夠被多個用戶經過網絡同時使用,須要爲你的系統增長網絡功能。編程

2.1 簡述你想爲你的系統增長什麼網絡功能?設計思路是什麼?

答:主要是添加了一個NetServer類,讓代碼可以被客戶端使用遠程鏈接來進行一系列操做。爲了讓系統可以同時被多個客戶端訪問,選擇了使用TCP技術以及多線程技術。在NetServer類中建立了ServerSocket對象的套接字,而後又建立一個ThreadServer類來實現多線程技術,該類實現了Runnable接口,在run方法裏寫出了用戶可進行的相應的操做。而後在主函數中建立線程,不斷接收新的客戶端,由此可實現多個用戶對系統的同時操做。小程序

2.2 系統經過網絡傳遞了什麼信息?信息的格式是什麼?

答:系統經過網絡將用戶端或是服務端所進行的操做使用IO流傳遞給對方,信息使用字節流InputStream以及OutputStream存儲,而後再經過字符流Scanner以及PrintWriter進行包裝傳輸。瀏覽器

2.3 你的網絡模塊使用了TCP仍是UDP技術?模塊中的經常使用類是什麼?

答:使用了TCP技術,模塊中最經常使用的類爲TCP網絡通訊方面的ServerSocket類以及Socket類,還有多線程方面的Runnable類和Thread服務器

2.4 截圖網絡通信部分的源代碼,並進行簡單說明。

答:主要就是建立了一個NetServer類,並定義其端口爲9700,而後在主函數中開啓服務端進行客戶端的接收,將接收到的客戶端放到一個線程中分別進行處理。在ThreadServer類中實現run方法來設定用戶所能進行的操做。







網絡

2.5 選作:使用本身編寫的客戶端訪問系統。簡述裏面的核心代碼。

建立套接字鏈接上圖書館系統的IP和端口號,而後設置兩個線程,分別實現客戶端與服務端之間的交流。



多線程

2.碼雲與PTA

3.1 統計本週完成的代碼量

須要將每週的代碼統計狀況融合到一張表中。
框架

周次 總代碼量 新增代碼量 總文件數 新增文件數
2 607 607 15 15
3 1642 1035 33 18
5 2044 402 42 9
6 2874 830 57 15
7 3161 287 63 6
8 4299 1138 72 9
9 4831 532 81 9
10 5475 644 93 12
11 5958 483 102 9
12 6819 861 116 14
13 7408 589 127 11
14 8348 940 141 14

選作:4. 網絡學習指導(如下做業內容均爲選作)

1. 網絡基礎

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


  • IP地址不一樣:由於二者服務器所處地區不同,因此IP也不同。117.185.17.151來自上海市,而112.5.163.149來自福建省廈門市。
  • 往返時間不一樣:廈門市的服務器離咱們更近一些,所以往返時間較快。

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

答:遠程登陸服務使用的默認端口爲23,這個通常常識,固然,也能夠用netstat命令進行查詢。eclipse

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

答:看到……一片黑暗,什麼內容都沒有。當使用了GET /index HTTP/1.0命令,會返回學校主頁的源碼。這是由於學校的網頁服從的是HTTP協議,所以要使用GET /index HTTP/1.0發送請求來得到網頁內容。socket


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

  • 360瀏覽器使用了443端口
  • 有道詞典使用了80端口
  • QQ使用了80端口,8080端口,443端口和那些遠程IP進行交互,這些IP分佈在廣東省深圳市,使用了TCP協議和UDP協議進行交互

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

  • 網絡協議(IP協議,TCP和UDP協議)
  • 端口和套接字(Socket、ServerSocket)
  • IP以及域名等基礎知識
  • 輸入輸出流

2. 編寫TCP客戶端程序

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

答:其實沒怎麼改源代碼,只是加了一個控制檯輸入,而後查詢了百度的IP地址進行接收該頁面的信息。


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



答:能夠看出,除了一些編碼上問題致使一些字符沒法正常顯示,二者返回的結果幾乎同樣。

2.3 將程序中的網址改爲cec.jmu.edu.cn,端口號改成80進一步觀察返回結果。沒有任何返回結果,爲何?怎麼修改代碼才能正常顯示?選作:爲何會返回亂碼?如何解決?

答:沒有返回結果是由於沒有使用GET / HTTP/1.0\n命令發送一個請求,所以不會有返回結果,加上以下代碼便可。


會出現亂碼主要是由於eclipse上的默認字符集是GBK,而網頁上的字符集不是,我先查看了網頁的源代碼,由下圖能夠看出,網站的字符集爲UTF-8,而後只要把eclipse上的字符集修改成UTF-8便可。最後再運行時便可正常顯示


2.4 啓動網絡調試助手,將其設置爲TCP Server,並啓動,以下圖所示(做業中不要出現下圖)

嘗試使用Client.java鏈接該TCP Server,使用該服務器向Client發送信息。(截圖關鍵代碼與運行結果)


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

答:通常要實現客戶端與服務器的交互,要用到線程的知識,能夠在代碼中建立兩個線程,分別實現他們的run方法,一個線程用於客戶機向服務端發送數據,另外一個線程用於服務器像客戶機發送數據。

2.6 選作:實現2.5。截取關鍵代碼並進行說明。




3. ServerSocket與TCP服務器

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





3.2 多線程MenuServer(截取關鍵代碼證實你這個是多線程服務器,請使用多個telnet鏈接測試)。



4. UDP服務器

4.1 改造3.1或3.2,將其改形成基於UDP的MenuServer。(區別題目3的TCP服務器的關鍵代碼,需截大圖、包含學號,不要截圖運行界面)。可使用網絡調試助手模擬UDP客戶端,將其設置爲UDP,要填本機IP與端口也要填遠程服務器的IP與端口


4.2 對比相應的基於TCP的MenuServer,主要有何不一樣?爲了鏈接多個客戶端,必定要經過多線程技術嗎?若是不使用,怎麼區分不一樣的客戶端呢?

答:UDP是一種無鏈接的數據交換方式,發送數據以前不須要創建鏈接,而TCP要創建完鏈接才能進行數據的傳送。爲了鏈接多個客戶端,須要使用多線程技術,否則由於UDP沒有在發送方和接收方之間建立鏈接,因此沒法區分不一樣的客戶端。

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

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

答:對於網絡聊天室,咱們可使用BufferedReader和BufferedWriter字符流來進行數據的接收和發送操做來實現用戶和用戶之間的通訊。在Java的網絡編程中,咱們先要使用套接字來建立一個對象,而後咱們要進行網絡之間的通訊,這時候就要用到Java中的各類IO流,所以,JAVA的IO流是網絡編程中進行數據傳輸的主要途徑。

6. 代碼閱讀

閱讀ServerAndThread目錄中的源代碼

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


答:這個程序的功能是用於鏈接客戶端和服務端,讓它們能夠進行通訊,相似一個簡易的聊天系統。學號直接加在標題欄了,簡單粗暴……

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

  • ServerChart:服務端的界面框架
  • ServerReadThread:與客戶端進行通訊,並將接收的消息顯示出來
  • ServerActionListener:服務端動做監聽器,爲服務端界面的按鈕添加監聽事件
  • ClientChart:客戶端的界面框架
  • ClientReaderThread:與服務端進行通訊,並將接收的消息顯示出來
  • ClientListener:客戶端動做監聽器,爲客戶端界面的按鈕添加監聽事件
  • MainThread:讓客戶端與服務端創建鏈接,將線程放入列表讓服務端去讀取

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

1.客戶端界面接收到的消息沒法區分是誰發送的。
改進方法:在客戶端和服務端發送消息時就標記上是誰發送的。
2.服務端接收的消息沒有換行。
改進方法:在服務端顯示在本身的消息上加一個換行符。
3.不管先關閉哪一端,都會讓另外一端由於還在不停請求輸入流而不斷輸出報錯信息。
改進方法:當另外一端關閉時,在處理異常時直接使用break退出請求。

相關文章
相關標籤/搜索