地址解析java代碼 java解析ip地址

java代碼解析

一樓的說的夠全面了,不過稍有誤解.

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出龍川免費(fèi)做網(wǎng)站回饋大家。

再來表示抱歉,我對編程語言中的中文名詞非常不了解,所以如果以下的回復(fù)對你的閱讀或者理解造成困難,請見諒.

1.首先,要明白這個問題的答案,需要了解call?(pass)?by?value?和?call?(pass)?by?reference?的區(qū)別.簡單來說:

call?by?value通常是復(fù)制這個parameter的值去另外一塊內(nèi)存里,然后傳給function,?所以在method/function里邊對這個變量的所有變更,實(shí)際上都是對復(fù)制過來的鏡像進(jìn)行操作,不會對原本的variable有任何影響.

call?by?reference是將parameter的reference傳給function,簡單點(diǎn)理解就是直接把variable傳給function.所以說這個variable的值是可以被function改變的.這個用法在c/c++中非常常見,用法是variable_name.

2.再來,在Java里邊,你可以很簡單的理解為:?Java中只有call?by?value,?也就是說,所以所有傳給function的parameter本身都不會被改變.?(這是最簡單直白的理解,當(dāng)然也有另一種常從sun的人那邊聽到的說法:Java是call?by?value?+?call?by?reference?by?value)

3.那么現(xiàn)在的問題就是為什么第二個結(jié)果是2了.?首先說一下sun官方的解釋:?對于reference?type在作為parameter/argument的時候,也是call?by?value,?但是在你擁有足夠權(quán)限時(比方說那個變量是public的,?不是final的等等各種符合的情況),可以修改這個object中fields的值(也就是屬于這個object(嚴(yán)謹(jǐn)點(diǎn)講是an?instance?of?the?object)?內(nèi)部的變量,?在你的例子中,?ko?里邊的?a?就是一個field,?所以update(ko)會使ko.a變成2).

4.如果你是一個有過c/c++學(xué)習(xí)經(jīng)驗(yàn)的人或者你以上的解釋很難理解,以下這種說法或許更適合你?(當(dāng)然了,這只是大多包括我在內(nèi)有c經(jīng)驗(yàn)的人的一種理解方式)

這里可以引入一個新的概念,pointer.?這是一種比較特殊的變量,它內(nèi)部所儲存的東西,其實(shí)只是另外一個變量的內(nèi)存地址.?如果對內(nèi)存沒有概念,你可以把它簡單理解為是風(fēng)箏的線軸,雖然看它本身看不出什么端倪,但是順著摸過去總會找到風(fēng)箏,看到它是什么樣子.?以pointer方式理解Java的人,通常會說:?Type?variable?=?new?Type();?這個過程中,最后生成的這個variable其實(shí)就是一個pointer,而不是instance本身.

在Java中,?有c/c++經(jīng)驗(yàn)的人通常認(rèn)為Java是call?by?value.同時,當(dāng)一個變量用在儲存reference?type的時候,實(shí)際上儲存的是它的pointer,這也一樣可以解釋為什么ko.a會有2這個結(jié)果,因?yàn)殡m然pointer被傳到function里邊時,本身是call?by?value,無法被改變.但這并不影響function本身對這個pointer指向的object的內(nèi)容做任何改變.?當(dāng)然,再次聲明,這只是一種幫助有c/c++經(jīng)驗(yàn)的人理解的方法.?Sun本身嚴(yán)正聲明Java里邊沒有pointer這個東西的存在.

5.?再來解釋一下為什么說樓上所說的(或者說樓上引用的)理解略有偏差.

引用"我們上面剛學(xué)習(xí)了JAVA的數(shù)據(jù)類型,則有:值類型就是按值傳遞的,而引用類型是按引用傳遞的"?這句話很明顯的有兩點(diǎn)錯誤.?第一點(diǎn),如果我上面所說的,Java是沒有call?by?reference的.

第二點(diǎn),暫且假設(shè)Java里邊是有call?by?reference的,?這句話依然不成立.

Java中的變量有兩種類型:?primitive?types?和?reference?type.

primitive?type包括byte,?short,?int,?long,?char,?boolean,?float和double.

而這8種之外的所有的,都是reference?type.

下面是一段對你的貼上來的code的一點(diǎn)延伸,希望可以幫助你更好的理解Java中的argument?/?parameter到底是如何運(yùn)作的.

public?class?Test?{

public?static?void?main(String[]?args)?{

int?a?=?1;

Koo?koo?=?new?Koo();

Object?o?=?new?Integer(1);

Koo?newKoo?=?new?Koo();

update(a);

update(koo);

update(o);

update(newKoo);

newUpdate(newKoo);

System.out.println(a);

System.out.println(koo.a);

System.out.println(o);

System.out.println(newKoo.a);

}

static?void?update(int?a)?{

a++;

}

static?void?update(Koo?koo)?{

koo.a++;

}

static?void?update(Object?o)?{

o?=?(int)?(Integer.parseInt(o.toString())?+?1);

}

static?void?newUpdate(Koo?koo)?{

koo?=?new?Koo();

}

}

class?Koo?{

int?a?=?1;

}

/*

o?=?(int)?(Integer.parseInt(o.toString())?+?1);?這一行中的(int)純粹是多余的,是否有這個casting對code本身沒有任何影響.?如果你高興也可以用

o?=?new?Integer(Integer.parseInt(o.toString())?+?1);

或者干脆

o?=?Integer.parseInt(o.toString())?+?1;

*/

以上這些code運(yùn)行之后會得到1?2?1?2的結(jié)果.?后面兩個結(jié)果可以很好的說明,?即使對objects?(reference?type?variables)?來看,?Java所應(yīng)用的也并不是call?by?reference.?否則的話,以上code運(yùn)行結(jié)果應(yīng)該是1?2?2?1

希望你可以真正理解這個新的例子中,產(chǎn)生1212這個結(jié)果的原因,從而對Java中的arguments有一個系統(tǒng)全面的認(rèn)識.

圖片是相關(guān)資料的鏈接,知道里貌似不能加網(wǎng)址

java解析出url請求的路徑和參數(shù)鍵值對類

解析url,本想用正則表達(dá)式處理,但正則表達(dá)式速度較慢。用split處理一下就可以了。

package?RequestPackage;

import?java.util.HashMap;

import?java.util.Map;

public?class?CRequest?{

/**

*?解析出url請求的路徑,包括頁面

*?@param?strURL?url地址

*?@return?url路徑

*/

public?static?String?UrlPage(String?strURL)

{

String?strPage=null;

String[]?arrSplit=null;

strURL=strURL.trim().toLowerCase();

arrSplit=strURL.split("[?]");

if(strURL.length()0)

{

if(arrSplit.length1)

{

if(arrSplit[0]!=null)

{

strPage=arrSplit[0];

}

}

}

return?strPage;???

}

/**

*?去掉url中的路徑,留下請求參數(shù)部分

*?@param?strURL?url地址

*?@return?url請求參數(shù)部分

*/

private?static?String?TruncateUrlPage(String?strURL)

{

String?strAllParam=null;

String[]?arrSplit=null;

strURL=strURL.trim().toLowerCase();

arrSplit=strURL.split("[?]");

if(strURL.length()1)

{

if(arrSplit.length1)

{

if(arrSplit[1]!=null)

{

strAllParam=arrSplit[1];

}

}

}

return?strAllParam;???

}

/**

*?解析出url參數(shù)中的鍵值對

*?如?"index.jsp?Action=delid=123",解析出Action:del,id:123存入map中

*?@param?URL??url地址

*?@return??url請求參數(shù)部分

*/

public?static?MapString,?String?URLRequest(String?URL)

{

MapString,?String?mapRequest?=?new?HashMapString,?String();

String[]?arrSplit=null;

String?strUrlParam=TruncateUrlPage(URL);

if(strUrlParam==null)

{

return?mapRequest;

}

//每個鍵值為一組?

arrSplit=strUrlParam.split("[]");

for(String?strSplit:arrSplit)

{

String[]?arrSplitEqual=null;?????????

arrSplitEqual=?strSplit.split("[=]");

//解析出鍵值

if(arrSplitEqual.length1)

{

//正確解析

mapRequest.put(arrSplitEqual[0],?arrSplitEqual[1]);

}

else

{

if(arrSplitEqual[0]!="")

{

//只有參數(shù)沒有值,不加入

mapRequest.put(arrSplitEqual[0],?"");???????

}

}

}???

return?mapRequest;???

}

}

測試類

package?RequestPackage;

import?java.util.Map;

public?class?TestCRequest?{

/**用于測試CRequest類

*?@param?args

*/

public?static?void?main(String[]?args)?{

//?請求url

String?str?=?"index.jsp?Action=delid=123sort=";????

//url頁面路徑

System.out.println(CRequest.UrlPage(str));

//url參數(shù)鍵值對

String?strRequestKeyAndValues="";???????

MapString,?String?mapRequest?=?CRequest.URLRequest(str);

for(String?strRequestKey:?mapRequest.keySet())?{

String?strRequestValue=mapRequest.get(strRequestKey);

strRequestKeyAndValues+="key:"+strRequestKey+",Value:"+strRequestValue+";";???????????

}

System.out.println(strRequestKeyAndValues);

//獲取無效鍵時,輸出null

System.out.println(mapRequest.get("page"));

}

}

測試代碼運(yùn)行效果

index.jsp

key:id,Value:123;key:sort,Value:;key:action,Value:del;

null

求獲取客戶端mac地址java代碼,急需急需,麻煩了

通過ip獲取指定ip地址的mac地址,ip可以通過請求request獲取,

request.getRemoteAddr();

(當(dāng)然獲取ip也不是在任何情況下都有效的)

通過了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實(shí)IP地址。

您也許需要通過其他的方式獲取,(見附)

//獲取mac如下 (nbtstat -A IPAddress是對給定的IP地址解析其主機(jī)名。如果不能正常解析它的主機(jī)

//名的話,有可能是防火墻屏蔽了。也可能是在DNS中將NetBios 解析選項(xiàng)屏蔽了。)

public String getMACAddress(String ip){

String str = "";

String macAddress = "";

try {

Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);

InputStreamReader ir = new InputStreamReader(p.getInputStream());

LineNumberReader input = new LineNumberReader(ir);

for (int i = 1; i 100; i++) {

str = input.readLine();

if (str != null) {

if (str.indexOf("MAC Address") 1) {

macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());

break;

}

if (str.indexOf("MAC Address") 1) {

macAddress = str.substring(str.indexOf("MAC 地址") + 14, str.length());

break;

}

//以上有個判斷,不同系統(tǒng)cmd命令執(zhí)行的返回結(jié)果展示方式不一樣,我測試的win7是MAC 地址

//所以又第二個if判斷 你可先在你機(jī)器上cmd測試下nbtstat -A 命令 當(dāng)然得有一個你可以ping通的

//網(wǎng)絡(luò)ip地址,然后根據(jù)你得到的結(jié)果中mac地址顯示方式來確定這個循環(huán)取值

}

}

} catch (IOException e) {

e.printStackTrace(System.out);

}

return macAddress;

}

附:

通過代理了的客戶端ip地址獲取方式

于是可得出獲得客戶端真實(shí)IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {

if (request.getHeader("x-forwarded-for") == null) {

return request.getRemoteAddr();

}

return request.getHeader("x-forwarded-for");

}

獲得客戶端真實(shí)IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {

String ip = request.getHeader("x-forwarded-for");

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip;

}

可是,如果通過了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串IP值,究竟哪個才是真正的用戶端的真實(shí)IP呢?

答案是取X-Forwarded-For中第一個非unknown的有效IP字符串。如:

X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100

用戶真實(shí)IP為: 192.168.1.110

如何用java代碼解析IP地址的位置,在線等 急

在咱大中華,IP定位,只能是定位到市一級,這個網(wǎng)上有好多工具包的,新浪的,阿里的,ip138的,都是非常簡單的,幾分鐘的事

本文名稱:地址解析java代碼 java解析ip地址
網(wǎng)站URL:http://muchs.cn/article4/hjchie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管建站公司、外貿(mào)建站網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司