http://www.ebook.edu.vn 102
Chương 5
Lp trình mng vi các lp InetAddress,
URL và URLConnection
1. Lp InetAddress
Các thiết b được kết ni vi mng LAN có địa ch vt lý duy nht. Điu này giúp
cho các máy khác trên mng trong vic truyn các gói tin đến đúng v trí. Tuy nhiên, địa
ch này ch có ích trong mng LAN. Mt máy không th xác định được v trí trên Internet
bng cách s dng các địa ch vt lý, vì các địa ch vt lý không ch ra v trí ca máy. Hơn
na, các máy thường di chuyn t v trí này sang v trí khác, trong trường hp ca máy
xách tay hoc máy palm chng hn.
Nhng người lp trình mng không cn phi quan tâm đến tng chi tiết d liu
được định tuyến như thế nào trong mt mng LAN. Hơn na, Java không cung cp kh
năng truy xut ti các giao thc tng liên kết d liu mc thp được s dng bi LAN.
Vic h tr như vy là rt khó khăn. Vì mi kiu giao thc s dng mt kiu địa ch khác
nhau và có các đặc trưng khác nhau, chúng ta cn phi các chương trình khác nhau cho
mi kiu giao thc mng khác nhau. Thay vào đó, Java h tr giao thc TCP/IP, giao
thc này có nhiu v liên kết các mng vi nhau.
Các thiết b có mt kết ni Internet trc tiếp được cung cp mt định danh duy nht
được gi là địa ch IP. Các địa ch IP có thtĩnh hoc động. Các địa ch IP được cp
phát động thường được s dng khi nhiu thiết b cn truy cp Internet trong khong thi
gian nht định. Mt địa ch IP ch có th gn vi mt máy, nó không th dùng chung. Địa
ch này được s dng bi giao thc IP để định tuyến các datagram ti đúng v trí. Không
địa ch, ta không th liên lc được vi máy đó; vì thế tt c các máy tính đều phi có
mt địa ch IP duy nht.
Lp java.net.InetAddress biu din mt địa ch Internet. Nó bao gm hai trường
thông tin: hostName (mt đối tượng kiu String) và address (mt s kiu int). Các trường
này không phi là trường public, vì thế ta không th truy xt chúng trc tiếp. Lp này
được s dng bi hu hết các lp mng, bao gm Socket, ServerSocket, URL,
DatagramSocket, DatagramPacket,…
1.1. To các đối tượng InetAddress
Lp InetAddress được s dng để biu din các địa ch IP trong mt ng dng
mng s dng Java. Không ging vi các lp khác, không có các constructor cho lp
InetAddress. Tuy nhiên, lp InetAddress có ba phương thc tĩnh tr v các đối tượng
InetAddress
Các phương thc trong lp InetAddress
public static InetAddress InetAddress.getByName(String hostname)
public static InetAddress[] InetAddress.getAllByName(String hostname)
public static InetAddress InetAddress.getLocalHost()
Tt c các phương thc này đều thc hin kết ni ti server DNS cc b để biết
được các thông tin trong đối tượng InetAddress
Ta xét phương thc đầu tiên. Phương thc này nhn tên ca hostname làm tham
s và tr v đối tượng kiu InetAddress
Ví d:
try{
InetAddress dc =InetAddress.getByName(“www.microsoft.com”);
System.out.println(dc);
http://www.ebook.edu.vn 103
}
catch(UnknownHostException e)
{
System.err.println(e);
}
Ví d 1:Viết chương trình nhn hostname t đối dòng lnh và in ra địa ch IP tương
ng vi hostname đó.
import java.net.*;
public class TimDCIP
{
public static void main(String[] args)
{
try{
if(args.length!=1)
{
System.out.println("Cach su dung: java TimDCIP
<Hostname>");
}
InetAddress host = InetAddress.getByName(args[0]);
String hostName = host.getHostName();
System.out.println("Host name:"+hostName);
System.out.println("Dia chi IP:"+host.getHostAddress());
}
catch(UnknownHostException e)
{
System.out.println("Khong tim thay dia chi");
return;
}
}
}
1.2. Nhn các trường thông tin ca mt đối tượng InetAddress
Ch có các lp trong gói java.net có quyn truy xut ti các trường ca lp
InetAddress. Các lp trong gói này có th đọc các trường ca mt đối tượng InetAddress
bng cách gi phương thc getHostname và getAddress().
public String getHostName(): Phương thc này tr v mt xâu biu din hostname
ca mt đối tượng InetAddress. Nếu máy không có hostname, thì nó s tr v địa
ch IP ca máy này dưới dng mt xâu ký t.
public byte[] getAddress() : Nếu bn mun biết địa ch IP ca mt máy, phương
thc getAddress() tr v mt địa ch IP dưới dng mt mng các byte.
http://www.ebook.edu.vn 104
Mt s địa ch IP và mt s mô hình địa ch có các ý nghĩa đặc bit. Ví d,
127.0.0.1 là địa ch loopback. Các địa ch IPv4 trong khong 224.0.0.0 ti
239.255.255.255 là các địa ch multicast.
Java 1.5 thêm vào hai phương thc cho lp InetAddress cho phép các ng dng
kim tra liu mt nút c thđến được hay không vi nút xut phát là nút hin hành;
nghĩa là kim tra xem mt liên kết mng đã được thiết lp hay chưa. Các liên kết có th b
phong ta vì nhiu nguyên nhân như firewall, các server y quyn, các router hot động
sai chc năng, dây cáp b đứt, hoc host xa không bt.
public boolean isReachable(int timeout) throws IOException
public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws
IOException
Các phương thc này c gng kết ni trên cng echo trên host xa để tìm xem nó
có th đến được hay không. Nếu host đáp ng trong khong thi gian timeout mili giây,
các phương thc này tr v gtr true nếu đến được, ngược li nó tr v giá tr false.
1.3. Mt s chương trình minh ha
Ví d 2 :Viết chương trình nhp mt hostName t đối dòng lnh và in ra dòng
thông báo cho biết địa ch IP tương ng vi địa ch IP đó thuc lp nào.
import java.net.*;
public class PhanLoaiDCIP
{
public static void main(String[] args)
{
try{
if(args.length!=1)
{
System.out.println("Cach su dung: java TimDCIP
<Hostname>");
}
InetAddress host = InetAddress.getByName(args[0]);
String hostName = host.getHostName();
System.out.println("Host name:"+hostName);
System.out.println("Dia chi IP:"+host.getHostAddress());
byte[] b=host.getAddress();
int i=b[0]>=0?b[0]:256+b[0];
if((i>=1)&(i<=126)) System.out.println(host+" thuoc dia chi lop A");
if((i<=191)&(i>=128)) System.out.println(host+" thuoc dia chi lop
B");
if((i<=223)&(i>=192)) System.out.println(host+" thuoc dia chi lop
C");
}
catch(UnknownHostException e)
http://www.ebook.edu.vn 105
{
System.out.println("Khong tim thay dia chi");
return;
}
}
}
Trong chương trình này ta ch cn lưu ý dòng lnh int i=b[0]>=0?b[0]:256+b[0]. Vì
ta biết trong Java kiu byte là kiu s nguyên có du có khong giá tr t -128 đến 127.
Do vy, dòng lnh int i=b[0]>=0?b[0]:256+b[0] làm nhim v chuyn đổi s nguyên có du
dng bù 2 v dng s nguyên không du
2. Lp URL
Cách đơn gin nht để mt chương trình Java định v và tìm kiếm d liu là s
dng mt đối tượng URL. Bn không cn phi lo lng ti các chi tiết bên trong ca giao
thc đang được s dng, khuôn dng d liu được nhn, hay làm thế nào để truyn tin
vi server; bn ch cn cho biết URL, Java s ly d liu v cho bn.
Lp java.net.URL là mt khái nim v b định v tài nguyên thng nht. Nếu lưu
tr URL dưới dng mt đối tượng String s không có li so vi vic t chc URL như
mt đối tượng vi các trường : giao thc (protocol), hosname, cng (port), đường dn
(path), tên tp tin (filename), mc tài liu (document section), mi trường có th được
thiết lp mt cách độc lp.
2.1. To các URL
Có bn constructor, khác nhau v thông tin mà nó cn. Constructor mà bn s
dng ph thuc vào thông tin mà bn có, và khuôn dng trong URL đó. Tt c các
constructor này s đưa ra ngoi l MalformedURLException (URL không đúng khuôn
dng) nếu ta to ra mt URL cho mt giao thc mà nó không được h tr.URL cung cp
các hàm cu t sau:
public URL(String url) throws MalformedURLException
Đây là constructor đơn gin nht; tham s ca nó ch là mt URL dng xâu.
Ví d
try{
URL u = new URL(“http://www.sun.com/index.html”);
}
catch(MalformedURLException e)
{
System.err.println(e);
}
public URL(String protocol, String host, String file) throws
MalformedURLException
Constructor này xây dng mt URL t các xâu phân bit xác định giao thc,
hostname, và tp tin. Port đưc thiết lp bng -1 vì vy cng mc định cho giao thc s
được s dng.
Ví d
http://www.ebook.edu.vn 106
try{
URL u = new URL(“http”,”/www.sun.com”,”index.html”);
}
catch(MalformedURLException e){
System.err.println(e);
}
public URL(String protocol, String host, int port, String file) throws
MalformedURLException
Trong mt s ít trường hp khi cng mc định không còn đúng, constructor này
cho phép bn xác định cng mt cách rõ ràng, là mt s kiu int. Các tham s khác ging
như trên.
Ví d
try{
URL u = new URL(“http”,”/www.sun.com”,80,”index.html”);
}
catch(MalformedURLException e){
System.err.println(e);
}
public URL(URL u, String s) throws MalformedURLException
Hàm cu t này xây dng mt URL tuyt đối t URL tương đối; có thđây là
constructor bn s s dng thường xuyên.
Ví d
URL u1,u2;
try{
URL u1= new URL(“http://www.macfaq.com/index.html”);
URL u2 = new URL(u1,”vendor.html”);
}
catch(MalformedURLException e)
{
System.err.println(e);
}
Tên file được loi khi đường dn ca u1, và tên file mi vendor.html được gán
vào để to lên u2. Constructor này đặc bit hu ích khi bn mun duyt qua mt danh
sách các file mà tt c cùng nm trong mt thư mc.
2.2. Phân tích mt URL thành các thành phn
Có sáu trường thông tin trong lp URL: giao thc, port, file, mc tham chiếu tài liu.
public String getProtocol()
Phương thc getProtocol() tr v mt xâu ký t biu din phn giao thc ca URL
public String getHost()