1, IP,端口號,域名,主機
IP-一個ip地址往往對應了一個服務器,或者說一臺主機。
端口號-每一臺主機有十二萬多個端口號,每一個端口號都可以發送網絡請求,端口號分爲TCP端口(6萬),UDP端口(6萬),其中小於1024號的端口往往被固定的一些應用所佔有,其他引用在發送請求的時候往往不能通過這些端口進行網絡請求。
域名-域名是方便大家記憶的網址,在訪問這些網址的時候會通過兩種方法轉換成IP地址才能連接到相應主機訪問相應的文件,其中之一,是通過,本機所特有的hosts文件,這個文件中定義了一些網址域名所對應的IP地址,當hosts文件中不存在這樣的對應關係時,就會採取另一種萬能的方法,就是向不屬於本機的DNS服務器發送請求,DNS服務器進行解析變成IP地址返回,再訪問IP地址,從而達到目的。
主機-主機一臺電腦,或者說是一臺有自己獨立IP地址的電腦,注意這裏電腦可以是筆記本,臺式,甚至巨型計算機。
相關內容在此不過多進行贅述,詳情請參看《TCP/IP詳解》
Java中實現這幾項功能的是使用:InetAdress來代表IP地址。
其下有兩個子類:Inet4Adress Inet6Adress分別代表了IPv4和Ipv6
InetAdress沒有提供構造器,而是提供了幾個靜態方法來獲取InetAdress實例
方法介紹:
靜態方法系:定義類-InetAdress 調用方式:InetAdress.<方法名+參數>獲取實例
getByName(String host)
簡介:根據主機獲取相應的Ip地址,參數爲host碼(host文件中網址對應的ip,或者可以理解爲DNS服務器中儲存的網址對應的IP地址)。
返回值:InetAdress對象
getByAdress(byte[]addr)
簡介:根據原始Ip地址獲取相應的對應的IP地址
返回值:InetAdress對象
getLocalHost()
簡介:返回本機的IP地址
返回值:InetAdress對象
常用非靜態方法介系:定義類-InetAdress 調用方式InetAdress實例對象.<方法名加參數>
getCanonicalHostName()
簡介:獲取此IP地址的權限定域名
返回值:String
getHostAdress()
簡介:返回該InetAdress對象所有的IP地址字符串。
返回值:字符串。
getHostName()
簡介:返回此IP地址的主機名。
返回值:String
IsReachable()
簡介:用於測試相應的IP地址是否能訪問該主機名。
返回值:String
注意:這是建立Service和Client之間連接的第一步,拿到地址才能建立連接。
這一步可以理解爲:建立連接的奠基。
2, 資源定位指針-URL資源定位器。
(1)字符串的轉換:
URLDecoder和URLEncoder編碼與解碼。
亂碼情況在網絡中是非常常見的一種情況。爲了避免這種情況,應和需求。就出現了java中的這兩個類。
URLDecoder類
decode(String s,String enc)靜態方法,可以將看似亂碼的東西(s)轉換成普通編碼。
URLEncoder類
URLEncoder(String s,String enc)靜態方法,可以將普通字符(s)轉換成MIME字符串。
(2)URL資源類
顧名思義,URL就是某一個資源所對應的地址。
URL的構造試用構造器
URL的訪問需要使用一些非靜態的方法。
getFIle()獲取資源名,返回值String
getHost()獲取主機名,返回值String
getPath()獲取URl路徑部分,返回值String
getPort()獲取URl端口號,返回值int
getProtocol()獲取相應的網絡協議,返回值Sting
getQuery()獲取該URL的查詢字符串部分,返回值String
openConnection()代表了遠程連接,返回值URlConnection對象
openStream()用於幫助讀取資源,返回值IntputStream
通過openStream方法可以實現多線程下載資源,其中涉及線程同步相關知識。資源的收取,利用與線程的同步,生產者消費者模型密不可分。
其中重要的URLConnection類代表了遠程連接,是一種非常實用的類,通過其中的getCottentLength()方法可以得到相應的資源大小,此後纔可以在磁盤中建立相應的儲存空間以放置這些相應的資源。
(3)URLConnection類-遠程連接類,連接類型。
創建方法,通過URL中的openConnection方法創建相應URL所對應的連接。
必不可少的是要在使用這個對象前,對其進行一系列的屬性設置,讓其完備,纔可以建立安全有效的連接。
然後介紹兩種基礎的連接:
網絡請求,網絡請求就像兩臺主機媽媽之間的對話,請求顧名思義,有求於人,一般是client向service發送的數據,用於表明服務器應該返回什麼樣類型數據的一些數據。
Get請求:這是一種相對於簡單的請求,一般像獲得html網頁文件這樣的簡單請求通過get請求完成,這種請求的攜帶數據相對簡單,這種請求的發送方式相對簡單,生成的方式簡單。但應用很廣泛,可以實現大部分網絡傳輸。
POST請求:這是一種相對於複雜的請求,相對於Get請求往往各方面都複雜得多,這是一種相對安全的請求,一般用於登錄密碼的驗證,轉賬之類需要安全的網絡傳輸。
URLConnection對象使用方法
<1>創建
<2>設置基礎屬性(即基礎攜帶數據)
<3>get請求使用connect()方法建立連接。POST請求需要獲取相應的輸入輸出流來進行傳輸。
<4>遠程資源變爲可用,通過訪問相應的頭字段或者使用建立連接的,輸入輸出流進行訪問相應的源。
重中之重就是設置URLConnection所攜帶的數據。
方法列表:
下列方法都很易懂,是設置相應的頭字段的值的方法。
SetAllowUserInteraction()
SetDoInput()
SetDoOUtPut()
SetifModifieSince()
SetUseCaches()
當然下面有一個類似於正則匹配的通用方法可以代替上述設置字段方法
SetRequestProperty(Stringkey,String value),key代表要匹配的相應要設置的頭字段,value即要設置的值。
人性化的java語言中還補充了一個方法
addRequestProperty(Stringkey,String value),同上只不過這個方法用於補充,在相應的頭字段後面追加一系列的值,不會覆蓋之前的設置。
一些用於獲取頭字段內容的常用方法:
GetContent()返回object, 獲取URLContent的內容
GetHeaderField(Stringname)返回String用於返回指定響應頭字段。
GetInputStream()返回輸出流,獲取URLConnection的值
GetOutputStream() 返回輸入流,向URLConnection發送請求參數
對於特定的頭字段類似於set系列方法,也有特定的get系列方法如下:
GetContentEncoding()
GetContentLength()
GetContentType()
GetDate()
GetExpiration()
GetLastModified()
發送get請求案例如下:
使用發送請求的url,發送請求的參數param
New出來新的連接url,使用url的openConnection方法new出來新的UrlConnection對象
使用set系方法設置URLConnection對象的屬性
使用connect方法建立連接,遍歷響應頭字段(URLConnection)
定義BufferReader接上使用getInputStream()方法返回的輸入流
獲取相應的資源
發送POST請求案例如下:
同樣需要一個發送連接的URL對象
拿到URL連接URLConnection對象
使用set系方法設置相應屬性
此時不再使用connect方法,改使用setDoOutput(true),setDoInput(true)
然後先獲取輸出流getOutputStream()方法輸出相應參數param
然後獲取輸入流同上所述。
最後注意參數的格式:
Param應滿足“name1=param1&name2=param2”
如此發送GET,POST請求成功獲取相應內容也已成功
如此相應的連接基礎已經結束,進入正題。
3, TCP網絡基礎之Socket網絡
Socket的中文釋義是插座,很形象,TCP的網絡連接就是兩個插座連在一起中間信息相互傳輸。
Java中也確實是這樣實行的兩個Socket對象之間的連接,不過要區分Client與Server兩者之間的區別,兩個端之間的Socket也略有不同。
接收客戶端信息的類-ServerSocket類
方法介紹:
構造方法:
New
參數:
1,監聽端口號
2,端口號,用於改變隊列長度的int backlog
4, 端口號,用於改變隊列長度的int backlog ,InnetAdress 多個IP地址限定其中一個IP地址
Accept()非靜態方法,返回值爲Socket用於建立兩者之間的通信
Close()非靜態方法,用於關閉使用完畢的ServerSocket對象
客戶端與服務器之間正正的連接橋樑-Socket類
構造:
New
參數介紹:
InnetAdress/String remoteAdress,int port
創建遠程主機連接,注意這裏沒有使用本機IP會自動獲取,沒有使用端口選擇,會自動使用系統分配的端口號。
InnetAdress/String remoteAdress,int port, InnetAdress localAdress,int localPort
與上一個方法不同之處就在於其制定了本機的IP地址,指定了發送請求的相應端口號
上述第一個參數String的意思是可以不指定相應的InnetAdrress對象而是直接使用相應的IP地址(String)作爲遠程連接的IP地址。
當兩個主機建立了相應的Socket連接以後,就可以進行相應的通信了
兩個必不少的輸入輸出方法:
GetInputStream(),getOutputStream()兩個相應的輸入輸出流實現了兩個網絡連接之間的數據傳輸。
SetSoTimeout(int timeout)非靜態方法,以毫秒爲單位
該方法指定了讀取操作的時間限制,當操作超出一定的時間限制以後,會自動斷開連接,由於網絡連接往往是阻塞式的,所以這方便了下一個連接的完成。
當超時後會拋出相應的異常:
SocketTimeoutException,如此進行一番捕獲後就可以實現諸多功能。
多線程的網絡連接:
對於服務器端,每一個Socket都應該對應着一個相應的線程,這樣避免了阻塞主線程使程序無法進行下去。
在此不做過多介紹。
基礎的java網絡通信在此告一段落。
Java中還提供了一系列的類和方法實現非阻塞的網絡連接,異步IO連接,UDP連接,代理服務器連接等。