1. 程式人生 > >20165207 第九周學習總結

20165207 第九周學習總結

能夠 分類 字符串 自然 多次 組成 inter 發出 發送

20165207 第九周學習總結

教材內容與問題解決

  1. 創建URL對象的常用構造方法有兩種,第一種給URL()傳入的參數是一個字符串,比如:"http://www.google.com" 使用這種方法,url對象的協議http,地址www.google.com是在字符串中給出的,url對象的資源是默認的主頁資源。另一種方法可以指定url對象的資源,參數列表為三個字符串String protocol給出協議、String host給出地址、String file給出資源。兩種方法都可能會拋出MalformedURLException異常,應放在try catch語句中創建URL對象。
  2. 讀取URL的資源可以調用openStream方法返回一個輸入流對象的引用,再對輸入流對象進行操作就可以對URL的資源進行輸出。需要註意的是URL資源的讀取可能會發生阻塞,所以應當在一個線程中讀取URL資源。技術分享圖片

  3. InetAddress類可以獲取Internet主機的地址以及本地主機的地址。InetAddress對象調用類方法getByname時,給字符串類型的參數傳入域名或者IP地址,就可以獲得一個InetAddress對象,這個對象既含有相應的域名也含有相應的IP地址。調用實例方法getHostName返回一個字符串,含有對象的域名。調用實例方法getHostAddress將返回一個字符串,含有的是對象的IP地址。另外靜態方法getLocalHost被調用時會返回一個InetAddress對象,這個對象含有本機的域名以及IP地址。技術分享圖片

  4. 當兩個程序需要交互信息時,可以使用套接字對象將兩個程序連接在一起。網絡套接字由IP地址與端口號組成,IP地址指明了服務器,端口號指明了這個占用此端口的程序。
  5. 使用構造方法Socket(String host,int port)為新建的套接字對象指定IP地址以及端口號來創建套接字對象時,程序可能拋出IOException異常,應當在try catch語句中進行。
  6. 要在服務器端獲得與客戶端相匹配的服務器端套接字,服務器首先需要用與客戶端創建套接字時一致的端口號port建立SeverSocket對象,再由此SeverSocket對象調用accept方法返回一個和客戶端Socket對象相連接的Socket對象。需要註意的是創建SeverSocket對象以及調用accept方法這兩個過程都有可能拋出IOException異常,應放到try catch中。
  7. 在SeverSocket調用accept方法時,如果沒有接收到客戶端的呼叫,accept方法會一直阻塞,該語句後面的方法得不到執行。可以使用setSoTimeOut設置超時值,在超時之後通過拋出異常停止accept方法的阻塞。技術分享圖片


    技術分享圖片
    技術分享圖片

  8. 使用套接字連接進行數據的讀取與直接從文件讀取有很大不同,在讀取過程發生阻塞時本線程後續的操作便無法得以實行。服務器端每收到一個客戶端套接字就應專門啟動一個為該客戶服務的線程。
  9. 另外,除了要求服務器端創建一個專門的線程來與客戶端建立連接,在客戶端和服務器端讀取信息時也應當在一個單獨的線程中。技術分享圖片

  10. 教材408頁從上到下第三個陰影區域,是一個說明如何用剛才的構造方法把“生日快樂”打包為數據包的例子。第二行末尾使用的方法getaName之前沒有講過,之前教的一直是getByName傳入域名,來返回一個InetAddress對象既含有域名也含有IP地址。經查找API,未發現InetAddress有getName這個方法。技術分享圖片
    所以,應該還是getByName。
  11. 接收發送過來的數據包需要用數據包來接收,不過用於接收的數據包創建時用的是另一個構造方法DatagramPack(byte data[],int length)和創建發送的數據包的方法是重寫的關系。用於接收的數據包自然是沒有目的地址和目的端口的。
  12. IP地址共分為4類,分類的依據是IP地址的a.b.c.d形式中a的數值,來界定四個數值中哪幾個是網絡地址哪幾個是主機地址。其中,a<128時,a後面的b.c.d就代表主機地址,這種情況稱為A類地址。128<=a<192的情況下,為B類地址,a.b表示網絡,c.d表示主機。a>=192時,為C類地址,這種情況下,a.b.c表示網絡,d表示主機。另外224.0.0.0~255.255.255.255是保留地址,也被稱為D類地址。廣播者的主機和接收廣播的主機需加入到同一個D類地址中才能夠進行廣播或者接收廣播,並且需保證廣播的主機具有有效的IP地址。
  13. 在412到414頁的程序中,我理解了在保證是D類地址的條件下,程序具有多點廣播套接字即MulticastSocket型的套接字就能夠進行廣播的發送和接收,但是究竟是進行發送還是接收要看MulticastSocket套接字調用的是send還是receive方法,以及配合發送或者接收的數據包。技術分享圖片

  14. 在JAVA遠程調用的情況下,用戶雖然實際上在和遠程對象的代理發出請求,但請求本身不需要因為是代理而做出改變,就像和遠程代理請求一樣。而且遠程對象的代理也就是RMI幫助生成的存根需要被下載到客戶端並且駐留在客戶端。
  15. 遠程代理需要實現java.rmi包中的Remote接口,實現這個接口是RMI辨別遠程對象的根據。此接口中沒有方法,實現時首先需擴展接口再讓創建遠程對象的類擴展子接口,擴展出的方法是RMI識別的客戶可以進行遠程調用的方法。
  16. 在IDEA的命令行中執行生成存根的命令會出錯,具體內容包括找不到類以及包結構不符,嘗試多次總是會有一種錯誤技術分享圖片
    技術分享圖片
    遂放棄,新建了另外的項目,專門用來遠程調用。但是,不知道是網絡還是什麽願因,註冊那一步中註冊了一個小時都沒有成,但後來還是出來了和教材一樣的結果技術分享圖片

代碼托管

項目鏈接

腳本截圖

技術分享圖片

上周錯題

  • 第7題:該程序中有兩個線程除了創建的線程還不能忽視主線程。
  • 第11題:我個人認為此題並不嚴謹,第360頁說的是如果main方法中沒有創建其他線程main方法返回,JVM就會結束。而且下面也明確地說了如果創建了其他線程JVM不會在main返回時就結束而會一直等到所有的線程都結束。然而此題的B選項並沒有明確main中有沒有創建其他新的線程。這也是當時我沒有選B選項的原因。
  • 第20題:程序應當只有一個main線程因為啟動創建的線程時代碼中沒有用start而是用的run,所以main中新建的線程沒有啟動,整個程序只是看起來有兩個,其實只有一個。

20165207 第九周學習總結