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圖形程式設計學習(4)Swing元件
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.