Java最初是作為一種網絡編程語言出現的
它能夠使用網絡上的各種資源和數據
與服務器建立各種傳輸通道
將自己的數據傳送到網絡的各個地方
你可以用Java很輕松地完成這些
因為Java類庫提供了很強大的網絡功能
本章主要介紹如下內容
Java網絡類和接口
InetAddress類
URL和URLConnection類
TCP/IP服務器與客戶端套接字
Datagram套接字
Java網絡類和接口 Java中有關網絡方面的功能都定義在程序包中
Java所提供的網絡功能可大致分為三大類
URL和URLConnection 這是三大類功能中最高級的一種
通過URL的網絡資源表達方式
很容易確定網絡上數據的位置
利用URL的表示和建立
Java程序可以直接讀入網絡上所放的數據
或把自己的數據傳送到網絡的另一端
Socket 所謂Socket
可以想像成兩個不同的程序通過網絡的通道
而這是傳統網絡程序中最常用的方法
一般在TCP/IP網絡協議下的客戶服務器軟件采用Socket作為交互的方式
Datagram 是這些功能中最低級的一種
其他網絡數據傳送方式
都假想在程序執行時
建立一條安全穩定的通道
但是以Datagram的方式傳送數據時
只是把數據的目的地記錄在數據包中
然後就直接放在網絡上進行傳輸
系統不保證數據一定能夠安全送到
也不能確定什麼時候可以送到
也就是說
Datagram不能保證傳送質量
InetAddress類 InetAddress類是Java的IP地址封裝類
它不需要用戶了解如何實現地址的細節
該類的定義如下
public final class InetAddress extends object implements Serializable
該類裡有兩個字段
hostName(String)和address(int)
即主機名和IP地址
這兩個字段是不公開的
我們不能直接訪問它們
下面我們介紹InetAddress類提供的Internet地址的操作
創建InetAddress對象的方法
InetAddress類沒有構造方法
要創建該類的實例對象
可以通過該類的靜態方法獲得該對象
這些靜態方法如下
public static InetAddress getLocalHost()
方法getLocalHost()獲得本地機的InetAddress對象
當查找不到本地機器的地址時
觸發一個UnknownHostException異常
示范代碼如下
try {
InetAddress address=InetAddress
getLocalHost( );
…; // 其他處理代碼
}
catch(UnknownException e) {
…; // 異常處理代碼
}
public static InetAddress getByName (String host)
方法getByName(String host)獲得由host指定的InetAddress對象
host是計算機的域名(也就是名字)
其作用跟IP地址一樣
只不過域名標識計算機比IP標識計算機更易於記憶
如果找不到主機會觸發UnknownHostException異常
示范代碼如下
try {
InetAddress address=InetAddress
getByName( host );
…; // 其他處理代碼
}
catch(UnknownException e) {
… // 異常處理代碼
}
public static InetAddress[] getAllByName(String host)
我們知道
在Internet上不允許多台計算機共用一個名字(或者說是IP地址)
但是在Web中
可以用相同的名字代表一組計算機
通過方法InetAddress[]getAllByName(String host)可以獲得具有相同名字的一組InetAddress對象
出錯了同樣會拋出UnknownException異常
示范代碼如下
try {
InetAddress address=InetAddress
getAllByName( host );
…; // 其他處理代碼
}
catch(UnknownException e) {
… // 異常處理代碼
}
實例
查詢IP地址的版本
InteAddress類有一個getAddress()方法
該方法將IP地址以網絡字節順序作為字節數組返回
當前IP只有
個字節
但是當實行IPV
時
就有
個字節了
如果需要知道數組的長度
可以用數組的length字段
使用getAddress( )方法的一般性用法如下所示
InetAddress inetaddress=InetAddress
getLocalHost( );
byte[ ] address=inetaddress
getAddress( );
我們要注意的是返回的byte[ ]字節是無符號的
但是Java沒有無符號字節的基本數據類型
因此如果要對返回的字節操作時
必須要將int做適當的調整
下面的方法就實現了這個目的
int unsignbyte = signbyte <
? signbyte +
: signbyte;
如果signbyte是負數
就加
使其成為正數
否則就保持不變
下面的程序示例
可以查詢IP地址是IPV
還是IPV
還能查詢IP的類別
【程序源代碼】
// ==================== Program Description ==================
// 程序名稱
示例
: IPVersion
java
// 程序目的
查詢IP的版本
熟悉InetAddress用法
// ======================================================
import
*;
import java
io
*;
public class IPVersion
{
public static void main(String args[])
{
try
{
InetAddress inetadd=InetAddress
getLocalHost();
byte[ ] address=inetadd
getAddress( );
if (address
length==
)
{
System
out
println(
The ip version is ipv
);
int firstbyte=address[
];
if (firstbyte<
)
firstbyte +=
;
if((firstbyte&
x
)==
)
System
out
println(
the ip class is A
);
else if ((firstbyte&
xC
)==
x
)
System
out
println(
The ip class is B
);
else if((firstbyte&
xE
)==
xC
)
System
out
println(
The ip class is C
);
else if((firstbyte&
xF
)==
xE
)
System
out
println(
The ip class is D
);
else if((firstbyte&
xF
)==
xF
)
System
out
println(
The ip class is E
);
}
else if(address
length==
)
System
out
println(
The ip version is ipv
);
}
catch (Exception e)
{ };
}
}
【程序輸出結果】
The ip version is ipv
The ip class is C
【程序注解】
在第
行用getLocalHost()方法得到本地的InetAddress對象inetadd
然後調用getAddress()方法返回IP字節數組
如果是
個字節的
就是IPV
如果是
個字節的
就是IPV
最後我們就可以根據第一個字節數判斷網絡類型
如果第一字節的形式是
*******
則這個地址就是A類地址
以表
判定可以得到B
C
D
E類地址
表
判斷網絡類型的位串
類 高 位 串
A
……
B
……
C
……
D
……
E
……
筆者所用主機的IP地址是C類地址
所以程序的輸出結果為
The ip class is C
如果運行該程序的主機的IP地址為其他類型
輸出結果會隨之改變
下面我們再介紹InetAddress類的另外兩個方法
public String getHostName()
getHostName()方法返回一個字符串
就是主機名字
如果被查詢的機器沒有主機名
或者如果使用了Applet
但是它的安全性卻禁止查詢主機名
則該方法就返回一個具有點分形式的數字IP地址
一般的使用方法如下所示
InetAddress inetadd = InetAddress
getLocalHost( );
String localname= inetadd
getHostName( );
public String toString()
toSring()方法得到主機名和IP地址的字符串
其具體形式如下
主機名/點分地址
如果一個InetAddress對象沒有主機名
則點分格式的IP地址將會被代替
下面的程序示例
就綜合使用了getHostName( )和tostring( )方法
【程序源代碼】
// ==================== Program Description ==================
// 程序名稱
示例
: Internet
java
// 程序目的
熟悉getHostName( )和tostring( )方法
// ==============================================================
import
*;
import java
io
*;
class Internet
{
public static void main(String args[])
{
try {
InetAddress inetadd;
inetadd=InetAddress
getLocalHost();
System
out
println(
hostname=
+inetadd
getHostName());
System
out
println(inetadd
toString() );
}
catch(Exception e) {
System
out
println(e);
}
}
}
【程序輸出結果】
D:\java project>java internet
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26214.html