1. 程式人生 > >20165318 2017-2018-2 《Java程序設計》第九周學習總結

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

spec utf 漢字 acc tcp協議 java虛擬機 accept 目的 code

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

目錄

  • 學習過程遇到的問題及總結
  • 教材學習內容總結
    • 第13章 Java網絡編程
  • 代碼托管
  • 代碼統計

學習過程遇到的問題及總結

  • Q1:運行課本例子4時,代碼中為漢字,但同樣的輸出的字符為亂碼。

技術分享圖片

  • 解決方法:檢查後發現,使用的編碼方式不一致,其他源文件使用的是GBK,而運行的Client4使用的是UTF-8,將這個源文件也改為GBK編碼,就可以正確運行了。

  • Q2:運行課本例子4後又運行例子3時,提示以下問題。
    技術分享圖片

  • 解決方法:我猜測可能是運行的例子4堵塞了進程,於是就將前面所有的運行程序都關掉,之後就可以正常運行例子3了。

  • Q3:運行Java遠程調用的相關例子時,出現以下錯誤
    技術分享圖片

  • 解決方法:IDEA中提示應該將所有類都方法sever包中,但我放進去之後還是不能正常編譯,後來我嘗試將ClientApplication類也放在sever包中,就可以正常運行了。

返回目錄

教材學習內容總結

第13章 Java網絡編程

13.1 URL類

  • URL類是java.net包中的一個重要的類,URL的實例封裝著一個統一資源定位符,使用URL創建對象的應用程序稱作客戶端程序。

  • 一個URL對象包含的三個基本信息:協議、地址和資源。

    • 協議:必須是URL對象所在的Java虛擬機支持的協議,常用的有:Http、Ftp、File協議,由參數protocol指定。
    • 地址:必須是能連接的有效IP地址或域名,由參數host指定。
    • 資源:可以是主機上的任何一個文件,由參數file指定。
  • 構造方法

    public URL (String spec) throws MalformedURLException
    public URL(String protocol,String host,String file) throws MalformedURLException
  • 讀取URL中的資源:調用InputStream openStream()方法返回一個輸入流。

13.2 InetAdress類

  • 地址的表示:域名和IP地址

  • 獲取Internet上主機的地址:
    1.使用InetAddress類的靜態方法getByName(String s)
    將一個域名或 IP 地址傳遞給該方法的參數 S,獲得一個 InetAddress 對象;
    1. public String getHostName()獲取InetAddress對象所含的域
    2. public String getHostAddress()獲取InetAddress對象所含的IP地址
  • 獲取本地機的地址:
    可以使用InetAddress類的靜態方法getLocalHost()獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。

13.3 套接字

  • 當兩個程序需要通信時,它們可以通過使用Socket類建立套接字對象並連接在一起(端口號和IP地址的組合得出一個網絡套接字)。

  • Socket類的構造方法:

    Socket(String host, int port)

    參數host是服務器的IP地址,port是端口號。

    //建立連接到服務器的套接字對象
    try { Socket clientSocket = new Socket("http://192.168.0.78",2010);
    }  //(IP,端口號)
    catch(IOException e) {}
  • ServerSocket 的構造方法:

    ServerSocket(int port)

    其中port 是一個端口號。

//建立ServerSocket對象
try{ ServerSocket serverForClient = new ServerSocket(2010);
}//(端口號)
catch(IOException e) {}


//使用accept()方法將客戶端和服務器端套接字連接起來
try{ Socket sc = serverForClient.accept();
}
catch(IOException e) {
  • 可以使用方法accept()將客戶端的套接字和服務器端的套接字連接起來。

  • 從套接字連接中讀取數據與從文件中讀取數據有著很大的不同,從文件中讀取數據時,所有的數據都已經在文件中了,而使用套接字連接時,可能在另一端數據發送之前,就已經開始讀取了。

  • 註意:accept方法也會阻塞線程的執行,直到接收到客戶的呼叫。

  • 使用多線程技術

    • 為了防止堵塞線程,服務器端收到一個客戶的套接字後,就應該啟動一個專門為該客戶服務的線程。
    • 使用InetSocketAddress創建一個對象,以connect。
  • 套接字通信基本原則:

    • 服務器應當啟動一個專門的線程,在該線程中和客戶的套接字建立連接。
    • 由於套接字的輸入流在讀取信息時可能發生阻塞,客戶端和服務器端都需要在一個單獨的線程中讀取信息。

13.4 UDP數據報

  • 套接字是基於TCP協議的網絡通信。

  • UDP的信息傳遞更快,但不提供可靠性保障,即無法知道數據能否正確到達目的地,也不能確定數據到達目的地的順序是否和發送的順序相同。

  • 基於UDP通信的基本模式:
    • 將數據打包,稱為數據包(好比將信件裝入信封一樣),然後將數據包發往目的地。
    • 接受別人發來的數據包(好比接收信封一樣),然後查看數據包中的內容。
  • 用DatagramPacket的以下兩個構造方法創建待發送的數據包:

    DatagramPacket(byte data[],int length,InetAddtress address,int port)
    DatagramPack(byte data[],int offset,int length,InetAddtress address,int port)

    方法DatagramSocket()負責發送數據包。
    方法receive(DatagramPacket pack)負責接收數據包。

13.5 廣播數據報

  • A類地址:a<128,則b.c.d表示主機。
  • B類地址:128<=a<192,則a.b表示網絡地址,c.d表示主機地址。
  • C類地址:a>=192,a.b.c表示網絡地址,d表示主機地址。
  • D類地址:224.0.0.0~224.255.255.255是保留地址
    要廣播或接收廣播的主機都必須加入到同一個D類地址。

  • D類地址不是用來你代表位置的,即在網絡上不能使用D類地址去查找計算機。

13.6 Java遠程調用

  • RMI是一種分布式技術,使用RMI可以讓一個虛擬機上的應用程序請求調用位於網絡上另一處虛擬機上的對象。

  • 代理的特點是它與遠程對象實現了相同的接口。

  • 存根是一種特殊的字節碼,並讓這個存根產生的對象作為遠程對象的代理,其字節碼後綴為"_Stub"。

  • 遠程對象必須實現java.rmi包中的Remote接口。

  • 代理的特點是它與遠程對象實現了相同的接口

  • RMI的設計細節
    • RMI使用rmic命令生成存根
    • 執行rimregistry命令
    • 啟動遠程對象服務
    • 運行客戶端程序

返回目錄

代碼托管

碼雲鏈接

代碼統計

技術分享圖片

技術分享圖片

返回目錄

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