java代碼設置代理不生效,java代理為什麼只能代理接口

本文目錄一覽:

Java動態代理問題;求解

jdk動態代理綁定的對象必須是一個接口申明的實現類,你可以看你public Object bind(Object obj)中的代碼,在返回對象時有個參數是調用getInterface().獲取接口,必須用接口去聲明

如何解決java.library.path屬性在代碼中設置不生效問題

可是在使用上面文章介紹的動態庫時,遇上了加載問題,也就是將動態庫放到什麼位置合適?文章中說可以放到System32目錄,但我不想這樣做,我更希望的是可以自己定製dll庫的位置~~

沒有將lib放到System32目錄,而是放到了自己的lib目錄,程序在啟動的過程中會報下面的錯誤:

java.lang.UnsatisfiedLinkError: no JIntellitype in java.library.path

根據上面的提示信息在VM參數處通過-Djava.library.path將加載路徑指定到自己的lib目錄後,程序可以正常啟動。

這種方式不是太好,因為要手動的去指定虛擬機參數,於是想通過System類的setProperty函數來在代碼中動態的改變一下java.library.path的值。

使用

Java代碼

System.setProperty(“java.library.path”, “./lib”);

[java] view plain copy

System.setProperty(“java.library.path”, “./lib”);

java中的動態代理問題

Hello hl=(Hello)Proxy.newProxyInstance(Hello.class.getClassLoader(), Hello.class.getInterfaces(), new MyInvocationHandler(new HelloImp()));

這裡的第2參數是錯的,應該是HelloImp類實現的接口,Hello沒實現任何接口

或者直接寫成new Class[]{Hello.class}

Java 中怎樣在程序中設置代理服務器

從JDK1.5開始,Java在java.net包下提供了Proxy和ProxySelector兩個類,其中Proxy代表一個代理服務器,可以在打開URLConnection連接時指定所用的Proxy實例,也可以在創建Socket連接時指定Proxy實例。而ProxySelector代表一個代理選擇器,它提供了對代理服務器更加靈活的控制,它可以對HTTP、HTTPS、FTP、SOCKS等分別設置,而且還可以設置不需要通過代理服務器的主機和地址。通過使用ProxySelector可以達到像在Internet Explorer、FireFox等軟件中設置代理服務器類似的效果。

代理服務器的功能就是代理網絡用戶去取得網絡信息。我們使用網絡瀏覽器直接連接其他Internet站點取得網絡信息時,通常需要發送Request請求來等到響應。代理服務器是介於瀏覽器和Web服務器之間的一台服務器,有了它之後,瀏覽器不是直接到Web服務器去取得網頁數據而是向代理服務器發出請求,Request請求會先送到代理服務器,由代理服務器來取回瀏覽器所需要的信息並送回給網絡瀏覽器。而且,大部分代理服務器都具有緩衝的功能,就好像一個大的Cache,它有很大的存儲空間,它不斷將新取得的數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web服務器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。歸納起來代理服務器主要提供如下兩個功能:

突破自身IP限制,對外隱藏自身IP地址。突破IP限制包括訪問國外受限站點,訪問國內特定單位、團體的內部資源。

提高訪問速度,代理服務器提供的緩衝功能可以避免每個用戶都直接訪問遠程主機,從而提高客戶端訪問速度。

17.5.1 直接使用Proxy創建連接

Proxy有如下一個構造器:Proxy(Proxy.Type type, SocketAddress sa):創建表示代理服務器的Proxy對象。而sa參數指定代理服務器的地址,其中type是該代理服務器的類型,該服務器類型有如下三種:

(1)Proxy.Type.DIRECT:表示直接連接或缺少代理。

(2)Proxy.Type.HTTP:表示高級協議的代理,如 HTTP 或 FTP。

(3)Proxy.Type.SOCKS:表示 SOCKS(V4 或 V5)代理。

一旦創建了Proxy對象之後,程序就可以在使用URLConnection打開連接時,或創建Socket連接時傳入一個Proxy對象,作為本次連接所使用的代理服務器。

其中URL包含了一個URLConnection openConnection(Proxy proxy)方法,該方法使用指定的代理服務器來打開連接;而Socket則提供了一個Socket(Proxy proxy)構造器,該構造器使用指定的代理服務器創建一個沒有連接的Socket對象。

下面以URLConnection為例來介紹如何在URLConnection中使用代理服務器。

程序清單:codes/17/17-5/ProxyTest.java

上面代碼第一行粗體字代碼創建了一個Proxy對象,第二行粗體字代碼就是用Proxy對象來打開URLConnection連接。除此之外,該程序的其他地方就是對URLConnection的使用了。由此可見, JDK1.5提供了對代理服務器很好的支持。

17.5.2 使用ProxySelector選擇代理服務器

前面介紹的直接使用Proxy對象可以在打開URLConnection或Socket時指定代理服務器,使用這種方式需要每次打開連接都顯式設置代理服務器。如果想讓系統打開連接時總是具有默認的代理服務器,則可以使用java.net.ProxySelector,它可以它根據不同的連接使用不同的代理服務器。

系統默認的ProxySelector會檢測各種系統屬性和URL協議,然後決定怎樣連接不同的主機。當然,程序也可以調用ProxySelector類的setDefaultI()靜態方法來設置默認代理服務器,也可以調用getDefault()方法獲得系統當前默認的代理服務器。

程序可以通過System類來設置系統的代理服務器屬性,關於代理服務器常用的屬性名有如下三個:

http.proxyHost:設置HTTP訪問所使用的代理服務器地址。該屬性名的前綴可以改為https、ftp等,分別用於設置HTTP訪問、安全HTTP訪問和FTP訪問所用的代理服務器地址。

http.proxyPort:設置HTTP訪問所使用的代理服務器端口。該屬性名的前綴可以改為https、ftp等,分別用於設置HTTP訪問、安全HTTP訪問和FTP訪問所用的代理服務器端口。

http.nonProxyHosts:設置HTTP訪問中不需要使用代理服務器的遠程主機,可以使用*通配符,如果有多個地址,多個地址用豎線(|)分隔。

下面程序示範了通過改變系統屬性來改變默認的代理服務器。

程序清單:codes/17/17-5/ ProxySelectorTest.java

上面程序中三行粗體字代碼設置Java打開HTTP訪問時的代理服務器屬性,其中前兩行代碼設置代理服務器的地址和端口,第三行代碼設置該代理HTTP訪問哪些主機時不需要使用代理服務器。上面程序的①行代碼處直接打開一個URLConnection,但系統會為打開該URLConnection時使用代理服務器。

運行上面程序,將會看到程序長時間等待,因為192.168.0.96通常並不是有效的代理服務器(當然,如果讀者運行的機器恰好可以使用地址為192.168.0.96的代理服務器又另當別論)。

系統提供了默認的ProxySelector子類作為代理選擇器,開發者可以實現自己的代理選擇器,程序可以通過繼承ProxySelector來實現自己的代理選擇器。繼承ProxySelector需要重寫兩個方法:

ListProxy select(URI uri):實現該方法讓代理選擇器根據不同的URI來使用不同的代理服務器,該方法就是代理選擇器管理網絡連接使用代理服務器的關鍵。

connectFailed(URI uri, SocketAddress sa, IOException ioe):當系統通過默認的代理服務器建立連接失敗後,代理選擇器將會自動調用該方法。通過重寫該方法可以對連接代理服務器失敗的情形進行處理。

系統默認的代理服務器選擇器也重寫了connectFailed方法,它重寫該方法的處理策略是:當系統設置的代理服務器失敗時,默認代理選擇器將會採用直連的方式連接遠程資源,所以當運行上面程序等待了足夠長時間時,程序依然可以打印出該遠程資源的所有內容。

java的網絡代理設置和自己的網絡代理軟件有衝突

需要使用代理。

使用Jsoup解析Url時,發現無論如何都不能解析,發現單位都是用的代理上網,可能和代理有關,所以,只要在程序中設置好代理就可以。

代理技術,其實不只是Java語言特有的技術,其實在互聯網早期就已經出現了這種技術。在計算機網絡層面,常用的代理技術有,正向代理、反向代理和透明代理。

原創文章,作者:OCBP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135778.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OCBP的頭像OCBP
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29

發表回復

登錄後才能評論