日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java URL协议扩展实现

發布時間:2023/12/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java URL协议扩展实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Java URL協議擴展實現 博客分類: java

在信息交互系統設計中,不乏有自定義通訊協議設計。本章會介紹如何利用?java.net.URL?類來自定義協議。

?

????? 一般而言,?URL?的格式是:?protocol://[authority]hostname:port/resource?queryString?。?URL?類能夠解析出?protocol、?hostname?、?port?等信息。?Protocol?決定了交互規范,通用的協議,比如?HTTP?、?File?、?FTP?等協議,?JDK?自帶了默認的通訊實現。當然,自定義實現是允許的。?Hostname?和?port?一般用于?Socket?或者基于?Socket?其他協議通訊方式。Resource?即資源上下文。可能讀者利用?URL?,通過指定協議(?protocol?)來獲取指定資源的讀寫,比如?JDK?內置了HTTP?、?File?、?FTP?等協議的處理方法。哪么?URL?的工作原理到底是怎么樣的呢?

????? 在成功地構造?URL?實例之后,?URL API?中定義了一個?openConnection()?方法,返回一個?java.net.URLConnection?抽象類型的實例。不過,這里?URL?對象是代理對象(組合了??對象),實際調用的是,?java.net.URLStreamHandler?對象的?openConnection()?方法。

????? java.net.URLStreamHandler?對象可以有兩條途徑得到:實現?java.net.URLStreamHandler?,或者實現java.net.URLStreamHandlerFactory?。

????? java.net.URLStreamHandler?是一個工廠類,通過?openConnection(java.net.URL)?方法來創建?java.net.URLConnection的實例。?java.net.URLStreamHandler?實現靈活度很大,既可以通過不同?protocol?的?URL?實例,產生java.net.URLConnection?對象。還可以通過相同?protocol?的多個?URL?對象,來產生對象。通用性實現,一種協議對應一個java.net.URLStreamHandler?實現。比如,在?SUN JDK?中?sun.net.www.protocol?子包下面的多個?Handler?類就是很好的例子。如果讀者有興趣,可以去看看相關實現。

????? 1.?通過?java.net.URLStreamHandlerFactory?機制

????? java.net.URLStreamHandlerFactory?,顧名思義,它是?java.net.URLStreamHandler?的工廠,即抽類工廠接口。通過調用?createURLStreamHandler(String protocol)?來創建?java.net.URLStreamHandler?對象。因此,建議java.net.URLStreamHandlerFactory?實現類應該采用?one protocol one hander?的模式,?SUN JDK?也采用該模式。

?????大致解了他們關系之后,再通過?UML Class diagram?來熟悉下:????

?

(圖?1?

?

?????圖?1?所示,?URL?包含了名為?factory?的?URLStreamHandlerFactory?類對象和?handler?的?URLStreamHandler?的實例對象。對于?URL?而言,?handler?對象是必須的,因為前面說到實際處理?openConnection()?方法是?handler?對象,而?factory并不是必須的。接下來,來分析這兩個對象是如何和?URL?交互的。

??????URL?的構造方法中,暫時不用關心協議字符串等參數,更多的關注于?URL context??URLStreamHandler?參數。URL?實例能夠依賴于?URL context?,當?URLStreamHandler?參數為空的情況下,當前?URL?實例將會采用?URL context?URLStreamHandler?成員對象。當?Context??URLStreamHandler?參數都為空的時。?URL?會調用?getURLStreamHandler?String)?方法,從而根據協議?(protocol)?獲得協議?URLStreamHandler?對象。

??????URL?底層實現中,最初會初始化一個?protocol??hander?鍵值關系的?Map?映射。如果找到已有的映射關系,立即返回?URLStreamHandler?對象(第一次是取不到?URLStreamHandler?對象的)。

?????如果找不到的話,并且?URL?類中的類成員?URLStreamHandlerFactory?實例不為空的情況下,這個實例通過URL#setURLStreamHandlerFactory?方法來注冊。?getURLStreamHandler?方法會調用這個類成員的createURLStreamHandler(String)?方法來創建?URLStreamHandler?實例。

?

?

?

Java代碼
  • URL.setURLStreamHandlerFactory(new?MyURLStreamHandlerFactory());??
  • (代碼?1?

    Java代碼
  • class?MyURLStreamHandlerFactory?implements?URLStreamHandlerFactory{??
  • ????????@Override ??
  • ????????public?URLStreamHandler?createURLStreamHandler(String?protocol)?{??
  • ????????????return?null;??
  • ????????}???
  • ??????????
  • }??
  • (代碼?2?

    ?

    ?

    ?

    ??????當?createURLStreamHandler?方法返回?null?的時候,?URL??getURLStreamHandler?方法會采用?URLStreamHandler處理機制。

    ?

    ?

    ??????2.?通過?java.net.URLStreamHandler?機制

    ??????2.1.?實現類包路徑定義

    ????????通過?JVM?啟動參數?-D?java.protocol.handler.pkgs?來設置?URLStreamHandler?實現類的包路徑,例如?-Djava.protocol.handler.pkgs=com.acme.protocol??代表處理實現類皆在這個包下。如果需要多個包的話,那么使用“?|”?分割。比如?-D?java.protocol.handler.pkgs=com.acme.protocol|com.acme.protocol2?。?SUN??JDK?內部實現類均是在sun.net.www.protocol.?包下,不必設置。?路徑下的協議實現類,采用先定義先選擇的原則?。

    ??????2.2.?實現類的命名模式

    ??????類的命名模式為?[package_path].[protocol].Handler?,比如默認實現”?sun.net.www.protocol.[protocol].Handler”,?比如HTTP?協議的對應的處理類名為?-sun.net.?www.protocol.http.Handler?。同樣,自定義實現的處理類,例如,?JDNI?協議實現類命名?com.acme.protocol.jndi.Handler?。

    ??????2.3.?實現類必須又默認構造器。

    ??????結合代碼分析,如下:

    Java代碼
  • URL?httpURL?=?new?URL(null,?"http://www.google.com",URLStreamHandler)null);??
  • URLConnection?urlConn?=?httpURL.openConnection();??
  • ?

    (代碼?3?

    ?

    ??????代碼?3?中沒有配置?URLStreamHandler?的類,并且代碼?2?中工廠類沒有實現了?HTTP?協議。這樣,?URL?會獲取默認的?HTTP?處理類?sun.net.?www.protocol.http.Handler?

    ??????Java 1.5?開始支持網絡代理的操作,因此?URLStreamHandler?實現類盡量覆蓋?openConnection(URL)?openConnection(URL,Proxy)?兩個方法。

    (EOF)

    ?

    ?

    http://mercyblitz.iteye.com/blog/735529

    轉載于:https://my.oschina.net/xiaominmin/blog/1597595

    總結

    以上是生活随笔為你收集整理的Java URL协议扩展实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。