網絡可以實現資源共享和通信,使用java.net包可以實現java的網絡功能。java.net包為網絡提供了功能強大的基礎
java.net包
套接字相關類
Web相關類
網絡
實現資源共享和通信
連接終端系統(主機)的通信系統
網絡適配器
計算機通過線纜連接
網絡接口卡NIC用於將計算機連接至線纜,也稱為網絡適配器
網絡中計算機之通信的規則
常用的協議
1.超文本傳輸協議HTTP
2.文件傳輸協議FTP
3.簡單郵件傳輸協議SMTP
4.網絡新聞傳輸協議NNTP
端口
用於實現程序間的通信
常用的端口
Telnet協議 23
簡單郵件傳輸協議 25
文本傳輸協議 21
超文本傳輸協議 80
客戶端/服務器模式
又稱為智能服務器/智能客戶端體系結構
服務器和客戶端共同承擔計算
1.客戶端
向另一台計算機請求服務的計算機
2.服務器
處理客戶端請求的計算機
優點:
服務器和客戶端分攤工作
服務器可以同時為數前台客戶端服務
多個客戶端可以同時訪問服務器
IP與DNS
IP地址
連接至網絡的每台計算機都是唯一的
32為數字,四個用點號分隔的數字
包括網絡ID和主機ID
網絡的類包括A、B、C和D類
域名系統
將特定IP地址映射至字符串
映射由域名服務器系統維護
Java.net包
可用的類
1.InetAddress
2.Socket、ServerSocket和SocketImpl
3.DatagramPacket和DatagramSocket
4.URL、URLConnection和URLEncoder
套接字
是Internet通信的端點
與主機地址和端口地址相關聯
客戶端與服務器通過套接字建立連接和進行通信
1.TCP/IP套接字
較可靠的雙向流協議
發送任意屬性的數據
提供消息確認、錯誤檢測和錯誤恢復等服務
2.UDP套接字
比較不可靠
InetAddress
封裝IP地址和DNS
工廠方法用於創建實例
1.InetAddress getLocalHost()
2.InetAddress getByName(String HostName)
package com.lizhenhua.test;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) {
try {
//獲取本機ip地址
InetAddress address = InetAddress.getLocalHost();
System.out.println(“本機IP地址:” + address);
//根據域名,通過DNS域名解析,獲得相應服務的主機地址
InetAddress add2 = InetAddress.getByName("www.163.com");
System.out.println("網易服務器主機:" + add2);
//根據字符串表現形式的IP地址獲得相應的主機地址(若果網絡上有該IP地址的話)
InetAddress add3 = InetAddress.getByName("192.168.0.22");
System.out.println("IP地址為192.168.0.22的主機:" + add3);
//根據機器名獲得相應的主機地址(如果網絡上有該機器名的話)
InetAddress add4 = InetAddress.getByName(add3.getHostName());
System.out.println("機器名為的本地主機名:" + add4);
//打印本機IP地址相關參數
//返回IP地址字符串
String HostAddress = address.getHostAddress();
//獲取本機的主機名。
String hostName = address.getHostName();
//返回本機的原始的IP地址
byte[] IP = address.getAddress();
//在給定主機名的情況下,根據系統上配置的名稱服務返回其 IP 地址所組成的數組。
InetAddress[] baidus = InetAddress.getAllByName("www.baidu.com");
//在給定原始 IP 地址的情況下,返回 InetAddress 對象。
//獲得本機的IP地址對象
InetAddress localhost = InetAddress.getByAddress(IP);
for (InetAddress inetAddress : baidus) {
System.out.println("IP地址:"+inetAddress.getHostAddress());
System.out.println("IP地址對應的主機名:"+inetAddress.getHostName());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
本機IP地址:PCOS-10271310/192.168.1.102
網易服務器主機:www.163.com/222.186.132.123
IP地址為192.168.0.22的主機:/192.168.0.22
機器名為的本地主機名:/192.168.0.22
IP地址:14.215.177.38
IP地址對應的主機名:www.baidu.com
IP地址:14.215.177.37
IP地址對應的主機名:www.baidu.com
Socket
建立服務器和客戶端之間的連接
構造函數
Socket(String hostName,int port)
Socket(InetAddress a ,int port)
可用方法
InetAddress getInetAddress()
int getPort()
int getLocalPort()
ServerSocket
accept( ) 方法用於等待客戶端觸發通信
構造函數
ServerSocket(int port)
ServerSocket(int port, int maxqu)
Socket編程
編寫服務器端程序:
創建一個服務器套接字(ServerSocket),綁定到指定端口;
調用accept方法,偵聽來自客戶端的請求,如果客戶發出請求,則接受連接,返回通信套接字(Socket);
調用Socket的getInputStream和getOutputStream方法,獲得輸入/輸出流,開始網絡數據的接收和發送;
關閉通信套接字,關閉服務器套接字。
編寫客戶端程序:
創建一個套接字(Socket) ,向服務器的偵聽端口發出請求;
與服務器正確連接後,調用Socket的getInputStream和getOutputStream方法,獲得輸入/輸出流,開始網絡數據的接收和發送;
關閉通信套接字。
關於IO流
計算機系統將除了CPU和內存以外其它所有設備都當成文件來處理,包括網絡終端(網卡)也不例外;
在兩台主機之間通過socket建立握手連接之後,主要是通過輸入/輸出流來接收和發送數據,實際上,對於網絡的操作,絕大部分是在操作IO流;
實際上操作網絡端口流與操作磁盤文件流的原理是相似的;
出於效率的考慮,scoket使用的是字節流,但是在實際操作中,字節往往會帶來不便,所以我們一般會把字節流改造成字符流後進行操作。
對於InputStream,先使用InputStreamReader轉化成字符流;
然後再使用BufferedReader建立緩沖,以提高效率,
如:
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader in = new BufferedReader(isr);
數據報
通信的一種報文類型
兩個類
DatagramPacket
數據容器
DatagramSocket
發送或接收DatagramPacket
DatagramSocket
用於發送或接收DatagramPacket
構造函數
DatagramSocket()
DatagramSocket(int port)
可用方法
void send(DatagramPacket d)
void receive(DatagramPacket p)
void close()
DatagramPacket
起到數據容器作用的類
構造函數
DatagramPacket(byte[] data,int size)
DatagramPacket(byte[] data,int size,InetAddress i,int port)
URL
指向Internet上的資源文件
URL類提供API來訪問Internet上的信息
URL的組件
協議
IP地址或主機名
端口號
實際文件路徑
URL
構造函數
URL(String urlname)
URL(String protocol, String hostname, int port, String path)
URL(String protocol, String hostname, String path)
URLConnection
抽象類
用於封裝由URL表示的Web對象的鏈接
提供進一步了解遠程資源的方法
可用方法
URLConnection openConnection*(
String getContentType()
long getLastModified()
int getContentLength()
URLEncoder
將文本字符串轉換為可以用作URL的形式
提供方法
encode()
1.將空格轉換為加號(+)
2.將%用作轉義碼,進行特殊字符的編碼
總結
java.net包
套接字相關類
Web相關類
OSI:Open Systems InterConnection;開放式系統互連。它為分層模型,將整個網絡分為七層,使得網絡中的計算機可以相互的以標准化交換信息,用於不同設備但又相互聯
1.物理層
檢測物理方面的設置
2.數據鏈路層
控制網絡層與物理層之間的通信
3.網絡層
將網絡地址翻譯成對應的物理地址,並決定如何將數據從發送方路由到接收方
4.傳輸層
負責確保數據可靠、順序、無錯的傳達到目的
5.會話層
負責在網絡中的兩節點建立和維持通信
6.表示層
象應用程序和網絡之間的翻譯官
7.應用層
負責對軟件提供接口以使程序能使用網絡服務
套接字(Socket)
套接字用於實現網絡上客戶端程序和服務器程序之間的連接。也就是說,網絡上兩個通信的程序之間總有一個連接,這個連接的端點稱為套接字。套接字是在一個較低層次上進行通信的。
套接字負責網絡上進程之間的通信,客戶端程序可以向套接字裡寫入請求,然後服務器會處理這個請求,並把處理結果通過套接字送回。具體來說,服務器應用程序一般會偵聽一個特定端口,用來等待客戶的連接請求,當一個連接請求到達時,客戶和服務器會建立一個通信連接,在連接過程中,客戶被分配一個本地端口號並與一個Socket連接,客戶通過寫Socket來通知服務器,再通過讀取Socket來獲取服務器發送過來的信息。類似地,服務器也獲取一個本地端口號,它需要一個新的端口號來偵聽原始端口上的其他連接請求。服務器也給它的本地端口連接一個Socket,通過讀寫它來與客戶通信。
Socket可以根據通信性質分類,這種性質對於用戶是可見的。應用程序一般僅在同一類的套接字之間進行通信。不過只要底層的通信協議允許,不同類型的套接字之間也可以通信。
用戶目前可以使用兩種套接字,即流套接字和數據報套接字。流套接字提供了雙向的、有序的、無重復的並且無記錄邊界的數據流服務。TCP是一種流套接字協議,數據報套接字支持雙向的數據流,但並不保證是可靠、有序、無重復的,也就是說,一個以數據報套接字來接收信息的進程有可能發現信息重復了,或者和發出的順序不同了。數據報套接字的一個重要特點是它保留了記錄邊界。UDP即是一種數據報套接字協議。
創建基於TCP協議的程序步驟:
1.服務器創建一個ServerSocket,然後調用accept()方法等待客戶連接;
2.客戶端創建一個Socket並請求與服務器建立連接。
3.服務器接受到請求連接,開始創建一個新的Socket與客戶建立專線連接;
4.建立了連接的兩個Socket在一個單獨的線程(由服務器程序創建)上對話
5.服務器開始等待新的連接請求
Java實現數據報
在java中提供了兩個類DatagramSocket和DatagramPacket支持數據報文方式通信
DatagramSocket:表示一個發送和接受數據報文的socket;發送的多個包可能經過不同的路徑,並且可以任意順序到達目的。
DatagramPacket:表示一個數據報文包。用來實現一個無連接包的傳送服務。一條消息從一台機器發送到另一台機器的選徑僅依賴這個包所包含的消息。
示例:
網絡協議:TCP/IP協議
TCP協議:傳輸控制協議;用來對數據提供可靠的報文流傳輸和對上層應用的連接服務,TCP使用順序的應答,能夠按需重傳報文用來在兩個或多個主機之間建立面向鏈接的通信。
IP協議:用於管理管理客戶端和服務器端之間的報文傳送;它是所有internet協議的基石它是一個面向包的協議,是無連接的。
UDP協議
UDP協議:也稱用戶數據報協議;是IP協議的另一個主機到主機層協議。提供了一種基本的、低延時的稱為數據報的傳輸
端口
端口是一個邏輯概念。每一個服務器都運行在該主機的一個對外開放的端口上。一個主機上可以有多種服務器,也就是有多個端口。程序員可以在創建自己的服務器程序時使用其它端口(即除了系統默認的端口)。端口常以數字編號,作為客戶可指定一個端口號,用這個端口號來連接相應的服務器以接收服務。
Socket通信
一對一的Socket C/S通信
TCP是一種可靠的、基於連接的網絡協議,在Internet上大都采用TCP/IP協議進行互聯。網絡上的兩個進程采用C/S模式進行通信。當兩台主機准備進行交談時,都必須建立一個Socket,其中一方作為服務器打開一個Socket並偵聽來自網絡的連接請求,另一個作為客戶,它向網絡上的服務器發送請求,通過Socket與服務器傳遞信息,要建立連接,只需指定主機的IP地址和端口即可。
void close() 關閉此套接字。
InetAddress getInetAddress() 返回套接字連接的地址。
int getLocalPort() 返回此套接字綁定的本地端口。
SocketAddress getLocalSocketAddress() 返回此套接字綁定的端點的地址,如果尚未綁定則返回null。
int getSoTimeout() 重新恢復SO_TIMEOUT的設置。
boolean isClosed() 返回套接字的關閉狀態。
void setSoTimeout(int timeout) 啟用/禁用帶有指定超時值的SO_TIMEOUT,以毫秒為單位。
String toString() 將套接字的實現地址和實現端口以String型返回。
InetAddress
InetAddress類主要是用來得到所指定的網絡地址,InetAddress類沒有直接顯式的構造函數。要生成一個InetAddress對象,必須運用一個可用的工廠方法。工廠方法(factory method)僅是一個類中的靜態方法返回一個該類實例的約定。這是在一個帶有各種參數列表的重載構造函數中完成的,當持有惟一方法名時可使結果更清晰。
InetAddress有三個方法可以用來創建InetAddress的實例
static InetAddress getLocalHost( ) throws UnknownHostException
static InetAddress getByName(String hostName) throws UnknownHostException
static InetAddress[ ] getAllByName(String hostName) throws UnknownHostException
InetAddress類的非靜態方法
boolean equals(Object other)如果對象具有和other相同的Internet地址則返回true。
byte[ ] getAddress( ) 返回此InetAddress對象的原始 IP 地址。
String getHostAddress( ) 返回與InetAddress對象相關的主機地址的字符串。
String getHostName( )返回與InetAddress對象相關的主機名的字符串。
int hashCode( ) 返回調用對象的散列碼。
boolean isMulticastAddress( ) 如果Internet地址是一個多播地址則返回true;否則返回false。
String toString( ) 返回主機名字符串和IP地址。
URL
URL類封裝了使用統一資源定位器(Uniform Resource Locator)訪問一個WWW上的資源的方法。這個類可以生成一個尋址或指向某個資源的對象。URL類生成的對象指向WWW資源(Web頁、文本文件、圖形文件、聲頻片段等等)
URL的基本表示方法是:
Protocol://hostname:port/resourcename#anchor
構造方法
public URL (String spec) 通過一個表示URL地址的字符串可以構造一個URL對象。如以下語句:
URL urlBase=new URL("http://www. 263.net/");
public URL(URL context, String spec) 通過基URL和相對URL構造一個URL對象。如以下語句:
URL net263=new URL ("http://www.263.net/");
URL index263=new URL(net263, "index.html")
public URL(String protocol, String host, String file);
URL url=new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");
public URL(String protocol, String host, int port, String file);
URL gamelan=new URL("http", "www.gamelan.com", 80, "Pages/Gamelan.network.html");
URL常用方法
public String getProtocol() 獲取該URL的協議名。
public String getHost() 獲取該URL的主機名。
public int getPort() 獲取該URL的端口號,如果沒有設置端口,返回-1。
public String getFile() 獲取該URL的文件名。
public String getQuery() 獲取該URL的查詢信息。
public String getPath() 獲取該URL的路徑。
public String getAuthority() 獲取該URL的權限信息。
public String getUserInfo() 獲得使用者的信息。
public String getRef() 獲得該URL的引用。
URL類的應用
URL類經常用於下載網絡資源,URL通過構造函數(構造函數為URL地址)可以得到一個對象,該對象的openStream()方法可以得到InputStream對象,得到InputStream就可以把網站上的資源下載下來了,下面是一個實例,使用URL類下載某個網站上的一張圖片並保存到本地。
URL url=new URL(“http://www.2cto.com/uploadfile/2016/0405/20160405095842914.gif“);
InputStream in = url.openStream();
FileOutputStream fout=new FileOutputStream(new File(“sohu.gif”));
int a=0;
while(a>-1)
{
//讀入數據
a=in.read();
//寫出數據
fout.write(a);
}
fout.close();
in.close();
}
URL url=new URL(“http://www.baidu.com“);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while((line=in.readLine())!=null){
System.out.println(line);
}
in.close( );
}catch(Exception e){
e.printStackTrace();
}
學習到這我們就可以在網絡上搜索其他資源了,圖片、聲音、文件等等,所有的任何資源只要我們知道它的URL就可以用以上的方法“下載”到本地了,其實我們完全可以參照以上的思想做一個類似網絡爬蟲的軟件或者是一個簡單的下載器了,然後從網絡上下載自己想要的資源。有興趣的同學可以參考其他資料來嘗試一下。
URLConnection
URL類中的openConnection()方法可生成一個URLConnection對象,URLConnection類的實例可用於讀取和寫入此URL引用的資源。在網絡編程工作中,JAVA的URLConnection是一個常用的類,它提供了一個非常方便的接口,只要提供需要連接的主機的URL地址,使用URL類的openConnection()方法就可以得到一個HttpURLConnection的對象,其中HttpURLConnection類是URLConnection類的子類,然後在此基礎上分析HTTP內容,完成相關任務。在這種方式下,使用者不必考慮底層的實現細節,避免了煩瑣的Socket類的代碼編寫,因此比較常用。
URLConnection常用方法
String getHeaderField(String name) 返回指定的頭字段的值。
InputStream getInputStream() 返回在此打開的連接讀取的輸入流。
String getContentEncoding() 返回content-encoding頭字段的值。
int getContentLength() 返回content-length頭字段的值。
String getContentType() 返回content-type頭字段的值。
long getDate() 返回date頭字段的值。