1. 程式人生 > >java網路程式設計學習(一)

java網路程式設計學習(一)

一 網路的分層

網路有兩個分層方案,一種是傳統的5層結構,另一種是ISO的7層結構

1 5層網路

(1)物理層

(2)資料鏈路層(PPP,Wifi,Ethernet)

(3)網路層(IP,ARP)

(4)傳輸層(TCP,UDP,ICMP)

(5)應用層(HTTP,FTP,SMTP,Ping,DNS)

2 7層網路

(1)物理層

(2)資料鏈路層(PPP,Wifi,Ethernet)

(3)網路層資料的表示、安全、壓縮。(IP,ARP)

(4)傳輸層(TCP,UDP,ICMP)

(5)會話層(建立、管理、終止會話,在五層模型裡面已經合併到了應用層)

(6)表示層(資料的表示、安全、壓縮,在五層模型裡面已經合併到了應用層。格式有,JPEG、ASCll、DECOIC、加密格式等。)

(7)應用層(HTTP,FTP,SMTP,Ping,DNS)

二 IPv4和IPv6

1 IPv4是使用4個位元組數字表示的網路地址。一般寫為點分四段的格式。

由於IPv4使用4個位元組表示,因此,寫成bit的形式是32個bit位。目前地址可以分為A、B、C、D、E五類地址。

A類地址:bit表示:0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子網掩碼:255.0.0.0

B類地址:bit表示:10XXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子網掩碼:255.255.0.0

C類地址:bit表示:110XXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子網掩碼:255.255.255.0

D類地址:bit表示:1110XXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,不區分網路地址和主機地址,用於組播

E類地址:bit表示:11110XXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,不區分網路地址和主機地址,用於實驗和測試

三 常用預設埠分配

echo:7

FTP資料傳輸:20

FTP指令傳輸:21

SSH:22

Telnet:23

SMTP:25

HTTP:80

四 Java中對應的IP地址類

Java中的java.net.InetAddress類是IP地址的抽象表示,Java中其他網路類都要使用這個類。

1 建立方法

(1)InetAddress address = InetAddress.getByName("www.baidu.com");

建立一個InetAddress物件,並建立與本地DNS伺服器的連線來查詢域名對應的IP地址,如果找不到對應的IP地址,則丟擲UnknownHostException異常。

(2)InetAddress address = InetAddress.getByName("208.201.239.100");

System.out.print(address.getHostName());

使用字串形式的IP地址建立一個InetAddress物件。在執行第一句的時候,並不會與本地DNS建立連線查詢域名,在執行到第二句時才會查詢。如果查詢到域名,則第二句打印出域名,否則,打印出IP地址(不會丟擲異常)。

(3)有時候一個域名會對應多個地址,如果需要得到所有地址,則

InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");

這個方法同樣會丟擲UnknownHostException。

(4)InetAddress address =  InetAddress.getLocalHost();

該方法嘗試連線DNS獲取本地主機的域名和IP地址,當獲取失敗後,該地址返回回送地址(localhost/127.0.0.1)。

(5)InetAddress address = InetAddress.getByAddresss(byte[] addr)

          InetAddress address = InetAddress.getByAddresss(String hostname,byte[] addr)

以上兩個方法的addr引數要求傳入一個位元組陣列(表示IP地址),由於Java中沒有無符號位元組,所以在傳入大於127的數字時,需要將其強制轉換為byte。

這兩個方法不會嘗試連線DNS伺服器,只有在引數的格式出現異常時,才會丟擲unknowHostExcepiton。

2 安全性問題

有些網路中不允許本地主機查詢外部DNS伺服器,認為這是一種不安全的操作。因此獲取InetAddress物件前,可以使用一下方法測試儲存目標地址的DNS是否可達。

SecurityManager.checkConnect(String hostname, int port);

3 InetAddress查詢方法

public String getHostname(); //獲取主機名,如果本地有快取就直接使用,否則查詢DNS

public String getCanonicalHostName();//獲取主機名,每次都查DNS

pulbic byte[] getAddress();//獲取主機IP地址

public String getHostAddress();//獲取主機IP地址

4 測試可達性(由於路由器、代理伺服器、防火牆等因素,導致本地主機與目標主機之間無法建立網路連線)

public boolean isReachable(int timeout) throws IOException

pulbic boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException

5 Object方法

(1)public boolean equals(Object o)

如果兩個InetAddress物件具有相同的IP地址,則兩個物件相等(不考慮主機名是否相等)。

(2)public int hashCode()

與equals()方法相同,該方法根據主機的IP地址生成hash值。

(3)public String toString()

返回格式為:主機名/點分四段地址

五 URL和URI

1 區別

URI稱為統一資源識別符號,可以使用網路位置標識資源,也可以由資源的名字、編號或者其他特性來標識資源。(側重對資源的標識)

URL是一種最常見的URI,它可以唯一的標識資源在Internet上的位置,是對網路資源定位和獲取的最簡單的方法。(側重對資源網路位置的定位和獲取)

2 URL語法

protocal://[email protected]:port/path?query#fragmet

protocal標識協議,如Http,Https,Ftp

query表示查詢,常用的地方在表單提交

fragment表示片段定位,如Html中的錨和XML中的XPointer。

3 建立URL物件

(1)使用字串構造URL

URL u = new URL("http://www.audubon.org/");

該方法嘗試使用引數中的字串構造一個URL,如果由於某些原因(協議不支援,或格式錯誤)無法構造,則丟擲MalformedURLException

(2)通過指定協議、主機名、檔名構造URL

URL u = new URL("http","www.eff.org","/blueribbon.html#intro");

該方法使用協議引數對應的預設埠連線資源,構造失敗時也會丟擲MalformedURLException。此處應該注意的是,最後一個引數應該以“/”開頭,表示檔案路徑。

當然也可以手動指定埠號

URL u = new URL("http","www.eff.org",8080,"/blueribbon.html#intro");

4 從URL中獲取資料

(1)InputStream in = url.openStream();

該方法在伺服器和客戶端之間完成必要的握手,並返回一個InputStream。該方法將目標資源當做文字來處理,得到原始的內容。

這種方法的問題是,它無法確定目標資源的種類,將目標資源當做文字處理;此外它讀取不到Http首部或者與協議相關的其他資訊,因此無法確定目標檔案的編碼格式。

(2)URLConnection uc = url.openConnection();

  InputStream in = uc.getInputStream();

這種方式可以訪問伺服器發出的所有資料,除了原始的文件本身外,還可以訪問這個協議指定的所有元資料;此外,這種方法還指出向伺服器寫資料,例如傳送郵件、提交表單等。

該方法還提供了一個過載版本,可以指定通過哪個代理伺服器傳遞連線。

public URLConnection openConnection(Proxy proxy) throws IOException;

(3)Object o = url.getContent();

這種方法獲取由URL引用的資料,嘗試由它建立某種型別的物件。

例如,如果URL指向某種文字,則返回InputStream,如果指向影象,則返回ImageProducer。

(4)URL u  = new URL("http://www.nwu.org");

           Class<?> types = new Class[3];

           types[0] = String.class;

           types[1] = Reader.class;

           types[2] = InputStream.class;

           Object o = u.getContent(types);

這種方式相當於定義了一種優先順序,getContent()方法首先嚐試使用String.class返回,如果不可以,則選擇Reader.class返回,以此類推。

方法(3)(4)返回Object物件之後,都應該使用instanceof來檢查返回物件的型別。

if(o instanceof String){}

else if(o instanceof Reader){}

else if(o instanceof InputStream){}

else{}

5 獲取Url的其他屬性

public String getProtocal()//獲取協議型別

public String getHost()//返回主機名

public int getPort()//返回指定的埠號,如果沒有指定埠號,則返回-1

public int getDefaultPort()//如果URL中沒有指定埠,則該函式返回協議對應的預設埠,如果沒有為這個協議定義預設埠,則返回-1

public String getFIle()//返回URL的檔案路徑

public String getPath()//返回URL檔案路徑(與getFile()不同,它的返回值不包含查詢字串)

public String getRef()//返回URL的片段標識部分(#),沒有片段標識部分返回null

public String getQuery()//返回URL查詢部分

public String getUserInfo//返回URL中的使用者名稱、口令資訊

public String getAuthority()//返回授權機構

6 相等性和比較

(1)URL類的equals()方法和hashCode()方法,要求兩個URL物件有相同的主機、埠、路徑資源、片段識別符號和查詢欄位時,才相等。(equals()方法嘗試查詢DNS伺服器來判斷兩個主機是否相等,所以,equals()方法可能被阻塞).

(2)URL沒有實現Comparable介面。

(3)URL有一個sameFile(URL u)方法,基本上與equals()方法相同,但是它不考慮片段識別符號。

7 URLEncoder和URLDecoder

發明Web時Unicode還沒有普及,所以URL中使用的字元必須來自ASCII的一個固定子集,包括大小寫字元、資料、一部分標點符號。

URL中除了上述字元外的其他字元,需要進行URL編碼。

String encoded = URLEncoder.encode("THis Strng has space", "UTF-8"); //將字串進行URL編碼

Strign decoded = URLDecoder.decode("This%20String%20has%20space", "UTF-8");//將字串進行URL解碼

六 代理

許多系統通過代理伺服器訪問Internet上的資源。代理伺服器可以提高內網主機訪問外網的安全性和效能。

基於URL類的Java程式可以使用大多數常見的代理伺服器和協議。

(1)設定代理的方式:啟動程式時使用-D選項,如 java -Dhttp.proxyHost=192.168.254.254 -Dhttp.proxyPort=9000

或者在程式碼中設定,如

System.setProperty("http.proxyHost", "192.168.254.254");

System.setProperty("http.proxyPort", "9000");

如果希望一臺主機不被代理,則設定http.nonProxyHosts屬性,使用“|”將多臺主機隔開。也可以使用萬用字元,設定某個域內的所有主機都不使用代理。

(2)上面設定代理的方式是全域性的代理設定,Proxy類可以實現Java對代理服務更加細粒度的控制,允許為不同的遠端主機選擇不同的代理。

Proxy類有三種代理:

Proxy.Type.DIRECT

Proxy.Type.HTTP

Proxy.Type.SOCKS

建立一個代理伺服器

SocketAddress address = new InetSocketAddress("proxy,example.com", 80);

Proxy proxy = new Proxy(Proxy.Type.HTTP, address);

使用代理伺服器:

URL u = new URL("http://www.baidu.com");

URLConnection con = new URLConnection(proxy);

(3)使用ProxySelector類,根據系統屬性和URL協議,決定通過不同代理連線不同的主機。

相關推薦

java網路程式設計學習

一 網路的分層 網路有兩個分層方案,一種是傳統的5層結構,另一種是ISO的7層結構 1 5層網路 (1)物理層 (2)資料鏈路層(PPP,Wifi,Ethernet) (3)網路層(IP,ARP) (4)傳輸層(TCP,UDP,ICMP) (5)應用層(HTTP,FTP,S

TCP/IP網路程式設計學習

前言:學校開的課比價不合理,這學期才剛剛接觸計算機網路,可是本學期很多課卻又是以計算機網路為基礎的。沒辦法,只能先自己學習一些計算機網路方面的知識。學習這個網路程式設計主要是為了做我的一個程式設計的實驗

Java併發程式設計學習——標準Thread

1、雖然System.out.println內部是加了鎖的,但是如果System.out.println(i- -),依然是執行緒不安全的,因為有的JVM,i- -需要三步才能完成。 2、通過interrupt方法停止執行緒 public class Int

Java集合框架學習List

collect 有序集合 original package images 遍歷 容量 exp 子類 先附一張Java集合框架圖。 從上面的集合框架圖可以看到,Java集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(M

Qt網路程式設計概述

Qt網路程式設計概述 QtNetWork模組提供了若干類支援TCP/IP客戶端伺服器端的開發。有如下兩類: 低階網路操作:QTcpSocket/QTcpServer/QUdpSocket 高階網路操作:QNetworkRequest/QNetworkReply

Java圖形程式設計學習4Swing元件

1、元件內部的設計—以Swing按鈕為例 背景:MVC模式,即模型-檢視-控制器模式。Swing元件底層大多數都用到了該模式。接下來以按鈕為例分析這種模式。 (1)元件的模型類,一般是實現以Model結尾的介面。按鈕的模型類實現了ButtonModel介面。實現了該介面

Java網路程式設計入門之TCP程式設計——複用Socket連線

如何複用Socket連線? 在前面的示例中,客戶端中建立了一次連線,只發送一次資料就關閉了,這就相當於撥打電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用客戶端連線。 那 麼如何實現建立一次連線,進行多次資料交換呢?其實很簡單

Java網路程式設計入門網路協議

 網路協議          對於需要從事網路程式設計的程式設計師來說,網路協議是一個需要深刻理解的概念。那麼什麼是網路協議呢?          網路協議是指對於網路中傳輸的資料格式的規定。對於網路程式設計初學者來說,沒有必要深入瞭解TCP/IP協議簇,所以對於初學者來

Java併發程式設計系列避免死鎖

避免死鎖 (1)避免一個執行緒同時獲取多個鎖 (2)避免一個執行緒在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源 (3)使用定時鎖,使用lock.trylock(timeout)替代內部鎖機制 (4)

Java NIO入門學習

本文為NIO入門學習的第一篇,將會介紹NIO中幾個重要的概念。 I/O即輸入輸出,指的是計算機和外界的介面,或者是單個程式同計算機其他部分的介面。 在Java1.4之前的I/O系統中,提供的都是面向流的I/O系統,系統每次處理一個位元組,輸入流(input stream)生

Java Web基礎學習

Java的Web開發學習 Web應用程式 Web應用程式是一種可用通過Web訪問的應用程式。Web應用程式的一個最大好處是使用者很容易訪問應用程式。使用者只需要有瀏覽器即可,不需要再安裝其他軟體。 軟體開發三大方向: ²  桌面應用程式(C/S) ²  Web應用程式(B/

linux網路程式設計基礎

 一、資料儲存順序:大端和小端          高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換       面試有時會出這麼個題:寫一個程式判

Java Socket 程式設計學習4

Java 利用Socket實現UDP客戶端和伺服器端 伺服器端: ServerBean類 package yang.socket.udp; import java.io.IOException; import java.net.DatagramPacket; impo

Java Socket 程式設計學習3

Java Socket 程式設計學習,利用DatagramSocket和DatagramPacket實現UDP資料傳輸 場景描述: 客戶端建立資料包,繫結伺服器地址和埠,向伺服器傳送資料;伺服器繫結埠,從埠接受資料 伺服器程式碼: ServerBean類 package y

Python 網路爬蟲學習

最近在學習一些Python網路爬蟲的東西,現將所學習內容整理如下,希望與大家相互交流,共同進步。 一、網路爬蟲基本概念 1.網路爬蟲(Web Spider) 是通過網頁的連結地址來尋找網頁的。從網站某一個頁面(通常是首頁)開始,讀取網頁的內

淺談Java併發程式設計系列—— 如何保證執行緒安全

執行緒安全類 保證類執行緒安全的措施: 不共享執行緒間的變數; 設定屬性變數為不可變變數; 每個共享的可變變數都使用一個確定的鎖保護; 保證執行緒安全的思路: 通過架構設計 通過

Java圖形程式設計學習2對JFrame的使用

目錄 1、頂層視窗類(框架)JFrame 2、 在框架中顯示資訊 3、繪製2D圖形 4、設定顏色 5、文字使用特殊字型 1、頂層視窗類(框架)JFrame (1)JFrame類是用於描述頂層視窗,JFrame就代表Swing中的視窗元件 (2)JFrame的

計算機網路學習

立個flag 以前錯過太多,既然選擇了這行,就應該做一行愛一行,用學習造就自己的未來。還是先從自己感興趣的計算機網路開始吧。接下來,按照計算機網路的知識點,依次過一遍吧!!! 計算機的網路概念 計算機網路(以下簡稱計網)發展的不同階段,人們的定義都會有

Java——I/O學習

Java I/O學習(一)什麼是I/O?I/O就是資料輸入輸出資料流,也稱作資料流。Java I/O操作主要指的是使用Java進行輸入、輸出操作,Java中的所有操作類都存放在Java.io包中,在使用時需要匯入此包。在整個Java.io包中最重要的就是5個類和1個介面,這5

Java介面程式設計實戰——簡易QQ登入介面

目標圖:介面分析:從上部和下部可以看出框架應該是用邊界佈局。邊界上部新增一個標籤附圖,下部新增一個JPanel面板構成流式佈局帶一個按鈕和一個標籤連結。在中間部分中,新增一個面板,新增選項卡窗格、文字框、密碼框、多選框、標籤等元件。程式碼實現:import java.awt.