Phần I: Lập trình mạng với các lớp InetAddress, URL, và URLConnection

1.Lớp InetAddress

Các thiết bị được kết nối với mạng LAN có địa chỉ vật lý duy nhất. Điều này giúp cho các máy khác trên mạng trong việc truyền các gói tin đến đúng vị trí. Tuy nhiên, địa chỉ này chỉ có ích trong mạng LAN. Một máy không thể xác định được vị trí trên Internet bằng cách sử dụng các địa chỉ vật lý, vì các địa chỉ vật lý không chỉ ra vị trí của máy. Hơn nữa, các máy thường di chuyển từ vị trí này sang vị trí khác, trong trường hợp của máy xách tay hoặc máy palm chẳng hạn.

Những người lập trình mạng không cần phải quan tâm  đến từng chi tiết dữ liệu được định tuyến như thế nào trong một mạng LAN. Hơn nữa, Java không cung cấp khả năng truy xuất tới các giao thức tầng liên kết dữ liệu mức thấp được sử dụng bởi LAN. Việc hỗ trợ như vậy là rất khó khăn. Vì mỗi kiểu giao thức sử dụng một kiểu địa chỉ khác nhau và có các đặc trưng khác nhau, chúng ta cần phải các chương trình khác nhau cho mỗi kiểu giao thức mạng khác nhau. Thay vào đó, Java hỗ trợ giao thức TCP/IP, giao thức này có nhiệu vụ liên kết các mạng với nhau.

Các thiết bị có một kết nối Internet trực tiếp được cung cấp một định danh duy nhất được gọi là địa chỉ IP. Các địa chỉ IP có thể là tĩnh hoặc động. Các địa chỉ IP được cấp phát động thường được sử dụng khi nhiều thiết bị cần truy cập Internet trong khoảng thời gian nhất định. Một địa chỉ IP chỉ có thể gắn với một máy, nó không thể dùng chung. Địa chỉ này được sử dụng bởi giao thức IP để định tuyến các datagram tới đúng vị trí. Không có địa chỉ, ta không thể liên lạc được với máy đó; vì thế tất cả các máy tính đều phải có một địa chỉ IP duy nhất.

Lớp java.net.InetAddress biểu diễn một  địa chỉ Internet. Nó bao gồm hai trường thông tin: hostName (một đối tượng kiểu String) và address (một số kiểu int). Các trường này không phải là trường public, vì thế ta không thể truy xất chúng trực tiếp. Lớp này được sử dụng bởi hầu hết các lớp mạng, bao gồm Socket, ServerSocket, URL, DatagramSocket, DatagramPacket,…

1.1. Tạo các đối tượng InetAddress

Lớp InetAddress  được sử dụng  để biểu diễn các địa chỉ IP trong một ứng dụng mạng sử dụng Java. Không giống với các lớp khác, không có các constructor cho lớp InetAddress. Tuy nhiên, lớp InetAddress có ba phương thức tĩnh trả về các  đối tượng InetAddress

Các phương thức trong lớp InetAddress

•  public static InetAddress InetAddress.getByName(String hostname)
•  public static InetAddress[] InetAddress.getAllByName(String hostname)
•  public static InetAddress InetAddress.getLocalHost()

Tất cả các phương thức này đều thực hiện kết nối tới server DNS cục bộ để biết được các thông tin trong đối tượng InetAddress.
Ta xét phương thức đầu tiên. Phương thức này nhận tên của hostname làm tham số và trả về đối tượng kiểu InetAddress

Ví dụ:

try{

InetAddress dc =InetAddress.getByName(“www.microsoft.com”);
System.out.println(dc);
}

catch(UnknownHostException e) {
System.err.println(e);
}

Ví dụ 1:Viết chương trình nhận hostname từ đối dòng lệnh và in ra địa chỉ IP tương

ứng với 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.Nhận các trường thông tin của một đối tượng InetAddress

Chỉ có các lớp trong gói java.net có quyền truy xuất tới các trường của lớp InetAddress. Các lớp trong gói này có thể đọc các trường của một đối tượng InetAddress bằng cách gọi phương thức getHostname và getAddress().

•  public String getHostName(): Phương thức này trả về một xâu biểu diễn hostname của một đối tượng InetAddress. Nếu máy không có hostname, thì nó sẽ trả về địa chỉ IP của máy này dưới dạng một xâu ký tự.

•  public byte[] getAddress() : Nếu bạn muốn biết địa chỉ IP của một máy, phương thức getAddress() trả về một địa chỉ IP dưới dạng một mảng các byte.

• Một số  địa chỉ IP và một số mô hình  địa chỉ có các ý nghĩa  đặc biệt. Ví dụ, 127.0.0.1 là  địa chỉ loopback. Các  địa chỉ IPv4 trong khoảng 224.0.0.0 tới 239.255.255.255 là các địa chỉ multicast.

Java 1.5 thêm vào hai phương thức cho lớp InetAddress cho phép các ứng dụng kiểm tra liệu một nút cụ thể có đến được hay không với nút xuất phát là nút hiện hành; nghĩa là kiểm tra xem một liên kết mạng đã được thiết lập hay chưa. Các liên kết có thể bị phong tỏa vì nhiều nguyên nhân như firewall, các server ủy quyền, các router hoạt động sai chức năng, dây cáp bị đứt, hoặc host ở xa không bật.

•  public boolean isReachable(int timeout) throws IOException

•  public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException

Các phương thức này cố gắng kết nối trên cổng echo trên host ở xa để tìm xem nó có thể đến được hay không. Nếu host đáp ứng trong khoảng thời gian timeout mili giây, các phương thức này trả về giá trị true nếu đến được, ngược lại nó trả về giá trị false.

1.3.Một số ví dụ minh họa:

Ví dụ 2 :Viết chương trình nhập một hostName từ  đối dòng lệnh và in ra dòng thông báo cho biết địa chỉ IP tương ứng với địa chỉ IP đó thuộc lớp 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) {
System.out.println(“Khong tim thay dia chi”);
return;
}
}
}

Tham khảo từ “Giáo trình lập trình mạng”

Lập trình mạng trong Java(Phần 2)

Lập trình mạng trong JAVA

Phần I: Lập trình mạng với các lớp InetAddress, URL, và URLConnection

1.Lớp InetAddress

Các thiết bị được kết nối với mạng LAN có địa chỉ vật lý duy nhất. Điều này giúp cho các máy khác trên mạng trong việc truyền các gói tin đến đúng vị trí. Tuy nhiên, địa chỉ này chỉ có ích trong mạng LAN. Một máy không thể xác định được vị trí trên Internet bằng cách sử dụng các địa chỉ vật lý, vì các địa chỉ vật lý không chỉ ra vị trí của máy. Hơn nữa, các máy thường di chuyển từ vị trí này sang vị trí khác, trong trường hợp của máy xách tay hoặc máy palm chẳng hạn.

Những người lập trình mạng không cần phải quan tâm  đến từng chi tiết dữ liệu được định tuyến như thế nào trong một mạng LAN. Hơn nữa, Java không cung cấp khả năng truy xuất tới các giao thức tầng liên kết dữ liệu mức thấp được sử dụng bởi LAN. Việc hỗ trợ như vậy là rất khó khăn. Vì mỗi kiểu giao thức sử dụng một kiểu địa chỉ khác nhau và có các đặc trưng khác nhau, chúng ta cần phải các chương trình khác nhau cho mỗi kiểu giao thức mạng khác nhau. Thay vào đó, Java hỗ trợ giao thức TCP/IP, giao thức này có nhiệu vụ liên kết các mạng với nhau.

Các thiết bị có một kết nối Internet trực tiếp được cung cấp một định danh duy nhất được gọi là địa chỉ IP. Các địa chỉ IP có thể là tĩnh hoặc động. Các địa chỉ IP được cấp phát động thường được sử dụng khi nhiều thiết bị cần truy cập Internet trong khoảng thời gian nhất định. Một địa chỉ IP chỉ có thể gắn với một máy, nó không thể dùng chung. Địa chỉ này được sử dụng bởi giao thức IP để định tuyến các datagram tới đúng vị trí. Không có địa chỉ, ta không thể liên lạc được với máy đó; vì thế tất cả các máy tính đều phải có một địa chỉ IP duy nhất.

Lớp java.net.InetAddress biểu diễn một  địa chỉ Internet. Nó bao gồm hai trường thông tin: hostName (một đối tượng kiểu String) và address (một số kiểu int). Các trường này không phải là trường public, vì thế ta không thể truy xất chúng trực tiếp. Lớp này được sử dụng bởi hầu hết các lớp mạng, bao gồm Socket, ServerSocket, URL, DatagramSocket, DatagramPacket,…

1.1. Tạo các đối tượng InetAddress

Lớp InetAddress  được sử dụng  để biểu diễn các địa chỉ IP trong một ứng dụng mạng sử dụng Java. Không giống với các lớp khác, không có các constructor cho lớp InetAddress. Tuy nhiên, lớp InetAddress có ba phương thức tĩnh trả về các  đối tượng InetAddress

Các phương thức trong lớp InetAddress

•  public static InetAddress InetAddress.getByName(String hostname)
•  public static InetAddress[] InetAddress.getAllByName(String hostname)
•  public static InetAddress InetAddress.getLocalHost()

Tất cả các phương thức này đều thực hiện kết nối tới server DNS cục bộ để biết được các thông tin trong đối tượng InetAddress.
Ta xét phương thức đầu tiên. Phương thức này nhận tên của hostname làm tham số và trả về đối tượng kiểu InetAddress

Ví dụ:

try{

InetAddress dc =InetAddress.getByName(“www.microsoft.com”);
System.out.println(dc);
}

catch(UnknownHostException e) {
System.err.println(e);
}

Ví dụ 1:Viết chương trình nhận hostname từ đối dòng lệnh và in ra địa chỉ IP tương

ứng với 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.Nhận các trường thông tin của một đối tượng InetAddress

Chỉ có các lớp trong gói java.net có quyền truy xuất tới các trường của lớp InetAddress. Các lớp trong gói này có thể đọc các trường của một đối tượng InetAddress bằng cách gọi phương thức getHostname và getAddress().

•  public String getHostName(): Phương thức này trả về một xâu biểu diễn hostname của một đối tượng InetAddress. Nếu máy không có hostname, thì nó sẽ trả về địa chỉ IP của máy này dưới dạng một xâu ký tự.

•  public byte[] getAddress() : Nếu bạn muốn biết địa chỉ IP của một máy, phương thức getAddress() trả về một địa chỉ IP dưới dạng một mảng các byte. http://www.ebook.edu.vn  104

• Một số  địa chỉ IP và một số mô hình  địa chỉ có các ý nghĩa  đặc biệt. Ví dụ, 127.0.0.1 là  địa chỉ loopback. Các  địa chỉ IPv4 trong khoảng 224.0.0.0 tới 239.255.255.255 là các địa chỉ multicast.

Java 1.5 thêm vào hai phương thức cho lớp InetAddress cho phép các ứng dụng kiểm tra liệu một nút cụ thể có đến được hay không với nút xuất phát là nút hiện hành; nghĩa là kiểm tra xem một liên kết mạng đã được thiết lập hay chưa. Các liên kết có thể bị phong tỏa vì nhiều nguyên nhân như firewall, các server ủy quyền, các router hoạt động sai chức năng, dây cáp bị đứt, hoặc host ở xa không bật.

•  public boolean isReachable(int timeout) throws IOException

•  public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException

Các phương thức này cố gắng kết nối trên cổng echo trên host ở xa để tìm xem nó có thể đến được hay không. Nếu host đáp ứng trong khoảng thời gian timeout mili giây, các phương thức này trả về giá trị true nếu đến được, ngược lại nó trả về giá trị false.

1.3.Một số ví dụ minh họa:

Ví dụ 2 :Viết chương trình nhập một hostName từ  đối dòng lệnh và in ra dòng thông báo cho biết địa chỉ IP tương ứng với địa chỉ IP đó thuộc lớp 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) {
System.out.println(“Khong tim thay dia chi”);
return;
}
}
}