20165214 第九周學習任務

學號 2017-2018-2 《Java程序設計》第九周學習總結

教材學習內容總結

  • 13.1 URL類:URL類是java.net包中的一個類,用URL建立的對象能夠獲取URL中的資,其包括三部分信息:協議、地址和資源。注意,協議必須被Java虛擬機所支持,地址必須是能連接的IP地址或域名。
    • URL類有兩個構造方法來建立URL對象:①public URL [連接名] throws MalformedURLException;②public URL([協議],[地址],[資源]) throws Exception
    • URL對象調用InputStream()方法返回一個指向對象包含的資源的輸入流,能夠用來讀取信息。
  • 13.2 InetAddress類
    • Internet上的主機有兩種方式來表示地址:①地址(如www.******.com)②IP地址(如202.***)。InetAdress類對象含有一個Internet主機地址的域名和IP地址。域名服務器(DNS)負責將域名轉化爲IP地址,而後與主機創建鏈接。
    • InetAdress類的兩個靜態方法:①getByName(String s),其中s是域名或者IP地址,調用此方法能夠得到InetAdress對象,含有主機地址的域名與IP地址,表示信息的格式爲[域名]/[IP地址];②getLocalHost()得到一個InetAdress對象,該對象還有本地機器的域名和IP地址。同時,IntAdress類中還有兩個實例方法:①public String getHostName()獲取對象所含的域名;②public String getHostAdress()獲取對象所含的IP地址。
  • 13.3 套接字:IP地址表示計算機,端口號表示進程(線程),Socket類建立套接字對象並鏈接在一塊兒(端口號與IP地址組合)。
    • 客戶端程序用Socket類建立負責鏈接到服務器的套接字對象,其構造方法爲Socket([IP地址],[端口號])(可能拋出IOException異常)。對套接字對象創建後,可使用①getInputStream()得到一個輸入流來讀取服務器寫入到輸出流中的數據;②getOutputStream()得到一個輸出流,服務器能夠用輸入流來讀取客戶寫入到輸出流中的數據。
    • 客戶負責創建鏈接到服務器的套接字對象。服務器須要建立一個ServerSocket對象來將客戶端的套接字對象與服務器的套接字對象鏈接起來。ServerSocket的構造方法是ServerSocket([端口號])(當端口已被佔用會拋出IOException異常)。接着,ServerSocket對象調用accept()方法再次返回一個與客戶端對象相鏈接的新的Socket對象。一樣的,它也具備上述的兩個方法。
    • 從套接字鏈接中讀取數據,可能在另外一端數據發送以前就已經開始讀取了,並且會阻塞本線程,直到成功讀取到信息。同時,accept方法也會阻塞線程的執行,直到收到客戶的呼叫。爲了解決「收不到呼叫而致使程序沒法繼續運行」的狀況,ServerSocket對象在調用accept方法以前能夠先調用setTimeout(s)方法來使得在調用accept方法時若是超過s毫秒沒有收到呼叫,就拋出SocketTimeoutException異常。
    • 雙方通訊完畢,套接字要使用close()方法關閉套接字鏈接。
    • 使用多線程技術:因爲使用套接字鏈接中讀取數據時,可能會阻塞本線程直到成功讀取到信息。爲了不這種狀況,須要啓動一個專門爲該客戶服務的線程。Socket的構造方法Socket()能夠建立一個套接字對象,該對象調用public void connect(SocketAddress endpoint) throws IOException來與指定的套接字建立鏈接。這裏的參數可使用InetSocketAddress的構造方法public InetSocketAdress(InetAdress addr,int port)來得到。套接字通訊的兩個基本原則:
      • ①服務器要啓動一個專門的線程與客戶的套接字創建鏈接;
      • ②套接字的輸入流在讀取信息時可能發生阻塞,因此客戶端與服務器端都須要在一個單獨的線程中讀取信息。
  • 13.4 UDP數據報
    • 比較UDP協議與TCP協議:UDP速度較快,但沒法保證可否送到目的地且沒法保證送達時的順序。
    • 數據包的發送與接收:使用DatagramPacked類的構造方法DatagramPacket([字節數組],[長度],[地址],[端口])建立數據包對象,使用DatagramSocket類建立的對象調用send([數據包])方法來發送數據包。要接收數據包以前,首先要用使用DatagramSocket類建立的對象,調用構造方法DatagramSocket(端口號)與被髮送的數據包建立鏈接,而後這個建立的對象調用receive([數據包])方法來接收數據包,其中數據包對象能夠用DatagramSocket類獲得構造方法DatagramPacket([字節數組],[長度])來建立數據包對象。
    • 注意事項:receive方法可能引發阻塞,直到收到數據包,且數據包的長度不能超過8192KB
  • 13.5 廣播數據報
    • Internet的地址是a.b.c.d的形式,計算機地址分爲四大類:
      • ②A類:a<128,則a表示網絡地址,b,c,d表示主機地址;
      • ②B類:128<=a<192,則a,b表示網絡地址,c,d表示主機地址;
      • ②B類:192<=a則a,b,c表示網絡地址,d表示主機地址;
      • ②B類:224.0.0.0~224.255.255.255是保留地址,稱爲D類地址。
    • 要廣播或者接收廣播的主機都必須加入到同一個D類地址,注意D類地址並不表明某個特定主機的位置。
  • 13.6 Java遠程調用
    • 遠程調用的基本步驟是:客戶程序請求遠程對象調用方法,而後遠程對象調用方法並返回必要的結果。
    • 代理與存根:RMI會生成一個存根(Stub)(使用rmic命令來產生。),並讓存根產生的對象做爲遠程對象的代理(存根的命名爲[字節碼文件_Stub].java)。代理與遠程對象實現了相同的接口。客戶端平時是跟代理打交道。
    • RMI爲標誌遠程對象,實現了java.rmi包中的Remote接口,注意必須擴展這個接口,同時遠程對象的類必需要實現Remote接口。
    • 遠程對象建立以前,RMI要求遠程服務器必須先啓動註冊rmiregistry。而後遠程服務器使用java.rmi包中的Naming類調用類方法rebind(String name.Remote obj)綁定一個遠程對象到rmiregistry所管理的註冊表中。

教材學習中的問題和解決過程

在本章的學習中,因爲跟着教材走,遇到不懂的內容也及時往回翻書看懂,因此基本上沒有什麼大問題。html

  • 問題1:在學到Java遠程調用的時候,我在想:咱們平時生活中的一些通訊也是經過這樣來實現的嗎?用的也是Java語言嗎?雖然瞭解了這些內容的原理,可是仍是想知道,到底是如何把這些東西實現到實處的?

代碼調試中的問題和解決過程

  • 問題1:在例子4中,當輸入N時就再也不進行面積計算,是由於調用了readDouble(),讀取到了不符合Double格式的信息嗎?仍是隻是可以獨特意識別「N」字符?
    java

  • 問題1解決方案:我在輸入時改爲了其餘字符,也是退出了程序,再也不進行面積計算。由此可知道,是當讀取到了不符合格式時,拋出異常。
    git

代碼託管

上週考試錯題總結

  • 錯題1
    數組

  • 錯題1解決:守護線程的一個特性是,當程序中的全部非守護線程都已結束運行時,即便守護線程的run方法中還有須要執行的語句,守護線程馬上運行。所以,守護線程不知道在何時就會中斷操做,所以不能訪問一些特定的資源。服務器

  • 錯題2
    網絡

  • 錯題2解決:
    本題中,因爲建立的線程thread只是建立了,可是沒有調用start()方法來啓動線程,因此它不算一個線程。所以整個程序中只有一個主線程。多線程

結對及互評

其餘

這周的學習任務感受比較抽象一些,不過我以爲本週學的內容應該是和咱們的生活比較接近了,我瞭解了像「聊天室」,「廣播臺」這種平時常見的東西的原理,收穫仍是很大的~
不過感受有點遺憾的是四則運算的多種語言尚未弄好。。發覺本身這幾天有點偷懶了。應該及時調整一下狀態。
補充~後來仍是完成了四則運算的多種語言,略微開心學習

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 36/36 1/1 8/8
第二週 432/468 2/3 15/23
第三週 964/1432 1/4 16/39
第四周 725/2157 1/5 14/53
第五週 1428/3585 3/8 18/71
第六週 1323/4908 1/9 17/88
第七週 960/5868 3/12 22/110
第八週 993/6861 2/14 23/133
第九周 2073/8934 2/16 20/153
  • 計劃學習時間:18小時.net

  • 實際學習時間:20小時線程

相關文章
相關標籤/搜索