3.Java網路程式設計之IP

weixin_34067049發表於2014-12-23

     前面兩篇博文我們已經簡單瞭解了IP、埠、協議以及兩種參考模型,我們現在重新從程式角度來看下這個參考模型.

     如果我們從事的是Web網站開發,那麼我們應該知道HTML是一種超文字標記語言 (Hyper Text Markup Language),而asp、php、jsp則是動態地生成HTML頁面的技術,而HTTP是超文字傳輸協義,是基於WWW,HTML是超文字傳輸語言,是基於HTTP.因此我們開發時其實是在應用層進行開發。

     如果我們從事的是網路程式設計則是在傳輸層和網際層進行開發。

 

IP協議:

 

理解:

 

       我們如果想和網上某一臺計算機進行通訊,首先我們需要要考慮如何和對方建立連線的問題,我們打算使用有線的光纖進行連線?還是通過有線電話或者手機進行通 訊?這就是資料鏈路層和物理層要乾的事。建立連線後,你打算和誰進行通訊?如果是手機,你是不是需要撥通一個手機號碼?但是如果是電腦的話,你想和誰聊天 如何確定?這時就需要通過網際層的IP協議來區分哪個IP是誰,這樣你才可以準確和你想聊天的人進行聊天。

 

上面說了這麼多概念廢話,現在我們來實戰用Java寫一個小程式來獲取本地計算機的主機名和IP。

我們要用到的知識點如下:

 

 

IPDemo.java原始碼如下:

import java.net.*;
class IPDemo  
{
    public static void main(String[] args)throws Exception
    {
        InetAddress i=InetAddress.getLocalHost();
        System.out.println(i.toString());//列印本地主機名和本地IP地址
        System.out.println("address:"+i.getHostAddress());//列印本地IP地址
        System.out.println("name:"+i.getHostName());//列印本地主機名
    }
}

程式截圖:

上面這個是獲取的本地計算機的主機名和IP地址,那麼能不能輸入任意一個計算機的主機名就獲取該計算機的相關資訊呢?

在java.net包下提供了這麼一個方法。

使用這個方法可以實現,但是要注意的是這個實現並不是所有都可以,那麼為什麼呢?

 


 

這裡要補充一個知識點,我們知道在網路中是通過IP地址來區分誰是誰,哪個計算機是哪臺計算機的。但是這個IP地址並不好記,因此後來引入了域名.當我們在瀏覽器位址列輸入:

http://www.baidu.com

這時候我們的計算機會首先訪問本地計算機的C:\WINDOWS\system32\drivers\etc\host檔案進行查詢,

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host

#
127.0.0.1 localhost #203.208.46.146 www.google.com #203.208.46.146 dl.google.com #203.208.46.146 dl-ssl.google.com

 查詢後沒有發現www.baidu.com,則向附近的DNS域名伺服器發出請求,進行相同的查詢。

雖然我沒有看過DNS域名伺服器資料存放格式但是推測至少應該有這樣一個類似的文件。

......

#61.135.169.121 www.baidu.com
#61.135.169.125 www.baidu.com
#111.13.100.91 www.baidu.com
#221.176.187.238 www.sina.com.cn
......

當我們查詢到www.baidu.com對應的ip後,DNS域名解析後,瀏覽器中的內容就變成了:

http://61.135.169.121

這時計算機開始向該IP對應的伺服器發出請求,伺服器接受請求後反饋給我們一個頁面,我們就看到了百度的首頁了。

因此,只有host檔案或者DNS域名伺服器中有對應的資訊才可以查到。

 


 

瞭解完這個後,我們再來寫這個程式。

我們現在要做的是輸入一個域名,獲取該域名所對應的IP。

 

 IPDemo.java原始碼如下:

import java.net.*;
class IPDemo  
{
    public static void main(String[] args)throws Exception
    {
        InetAddress i=InetAddress.getByName("www.baidu.com");
        System.out.println("address:"+i.getHostAddress());//列印該主機IP地址
        System.out.println("name:"+i.getHostName());//列印該主機主機名
    }
}

 這裡要注意的是由於百度要向很多使用者提供服務,因此對應的IP不止一個。

程式執行截圖:

 

附錄:

使用站長工具查詢結果:

使用IP.CN網站查詢結果:

使用ping方式查詢結果:

 

相關文章