Giáo trình Lập trình mạng: Phần 1 cung cấp cho người học những kiến thức như: Các khái niệm cơ bản về mạng máy tính; Các dòng vào-ra (stream); Lập trình đa luồng trong java; Lớp inetaddress. Mời các bạn cùng tham khảo!
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC TÂY BẮC GIÁO TRÌNH LẬP TRÌNH MẠNG NGUYỄN DUY HIẾU MAI VĂN TÁM SƠN LA, NĂM 2019 LỜI NÓI ĐẦU Trong năm gần đây, lập trình mạng ln nội dung quan trọng lĩnh vực công nghệ phần mềm Nhờ phát triển vượt bậc lĩnh vực mạng máy tính, phần mềm máy tính dùng cho doanh nghiệp sử dụng nhiều môi trường mạng đặc biệt Internet Mạng máy tính nơi kỹ thuật liên quan tới mơ hình khách/chủ, mơ hình phân tán hay mơ hình hợp tác triển khai Các ứng dụng mạng xử lý tập trung phân tán, tận dụng tối đa sức mạnh hệ thống phần cứng để mang lại hiệu cao Giáo trình phục vụ giảng dạy học tập học phần Lập trình mạng Trường Đại học Tây Bắc Trong nội dung, kiến thức mạng máy tính có liên quan, hướng dẫn cách thức làm việc với kỹ thuật lập trình socket với giao thức TCP, UDP kỹ thuật lập trình phân tán RMI Trong phần kiến thức, giáo trình cung cấp ví dụ minh họa Đây ví dụ bản, giúp bạn đọc hiểu cách thức mà ứng dụng mạng hoạt động Từ ví dụ này, độc giả tự phát triển để tạo ứng dụng phức tạp hơn, mạnh mẽ Chúng tơi lựa chọn ngơn ngữ lập trình Java để trình bày kỹ thuật liên quan tới lập trình mạng ví dụ minh họa Việc lựa chọn ngơn ngữ lập trình Java khơng Java ngôn ngữ hàng đầu để phát triển phần mềm mà Java ngôn ngữ vốn sinh để giải vấn đề liên quan tới ứng dụng mạng Giáo trình khơng tránh khỏi sơ suất Chúng tơi mong nhận ý kiến đóng góp quý báu quý thầy cô bạn sinh viên để hồn thiện giáo trình Chúng tơi xin chân thành cảm ơn NHÓM TÁC GIẢ MỤC LỤC CHƯƠNG CÁC KHÁI NIỆM CƠ BẢN VỀ MẠNG MÁY TÍNH 1.1 Mạng máy tính 1.2 Các lớp mạng 1.2.1 Lớp máy tính-mạng 1.2.2 Lớp Internet 1.2.3 Lớp giao vận 1.2.4 Lớp ứng dụng 1.3 Giao thức IP, TCP UDP 1.3.1 Khái quát giao thức IP, TCP UDP 1.3.2 Địa IP tên miền 1.3.3 Các cổng 1.4 Mạng Internet 10 1.4.1 Các khối địa Internet 10 1.4.2 Dịch địa mạng 11 1.4.3 Tường lửa 11 1.4.4 Máy chủ proxy 11 1.4.5 Mơ hình Client/Server 13 CHƯƠNG CÁC DÒNG VÀO-RA (STREAM) 15 2.1 Các dòng (output stream) 15 2.2 Các dòng vào (input stream) 19 2.3 Các dòng filter stream 23 2.3.1 Gắn kết filter stream 25 2.3.2 Các lớp BufferedInputStream BufferedOutputStream 25 2.3.3 Lớp PrintStream 26 2.3.4 Các lớp DataInputStream DataOutputStream 27 2.4 Các lớp Reader and Writer 29 2.4.1 Lớp Writer 29 2.4.2 Lớp OutputStreamWriter 30 2.4.3 Lớp Reader 30 2.4.4 Các lớp Filter Reader Filter Writer 31 2.4.5 Lớp Scanner 32 2.4.6 Lớp PrintWriter 33 CHƯƠNG LẬP TRÌNH ĐA LUỒNG TRONG JAVA 35 3.1 Giới thiệu luồng (thread) 35 3.1.1 Thread gì? Multi-thread gì? 35 3.1.2 Đa nhiệm (multitasking) 35 3.1.3 Ưu điểm nhược đa luồng 36 3.2 Vòng đời luồng Java 36 3.3 Cách tạo luồng Java 37 3.3.1 Tạo luồng cách kế thừa từ lớp Thread 38 3.3.2 Tạo luồng cách thực từ giao diện Runnable 38 3.4 Ví dụ minh họa sử dụng đa luồng 39 3.5 Các phương thức lớp Thread thường hay sử dụng 43 3.6 Một số vấn đề liên quan đến luồng 44 3.6.1 Một số tham số luồng 44 3.6.2 Sử dụng phương thức sleep() 46 3.6.3 Sử dụng join() join(long millis) 47 3.6.4 Xử lý ngoại lệ cho luồng 49 CHƯƠNG LỚP INETADDRESS 51 4.1 Khởi tạo đối tượng InetAddress 53 4.2 Nhớ đệm (caching) 55 4.3 Tìm kiếm địa IP 56 4.4 Các phương thức Get 56 4.5 Kiểm tra loại địa 58 4.6 Kiểm tra khả kết nối (reachable) 62 4.7 Các phương thức Object 62 4.8 Inet4Address Inet6Address 63 4.9 Lớp NetworkInterface 64 CHƯƠNG LẬP TRÌNH VỚI GIAO THỨC TCP 67 5.1 Khái niệm chung 67 5.2 Khái niệm cổng (port number) 67 5.3 Lớp Socket 68 5.3.1 Các phương thức tạo 68 5.3.2 Các phương thức kiểm soát vào-ra 69 5.3.3 Một số phương thức khác 69 5.4 Lớp ServerSocket 70 5.4.1 Các phương thức tạo 70 5.4.2 Các phương thức khác 71 5.5 Lập trình TCP mơ hình Client/Server 72 5.6 Xử lý ngoại lệ lập trình mạng 73 5.7 Một số ví dụ 73 CHƯƠNG LẬP TRÌNH VỚI GIAO THỨC UDP 82 6.1 Khái niệm chung 82 6.2 Lớp DatagramSocket 84 6.3 Lớp DatagramPacket 85 6.4 Lập trình UDP theo mơ hình Client/Server 85 6.5 Một số ví dụ 87 CHƯƠNG KỸ THUẬT LẬP TRÌNH PHÂN TÁN RMI 91 7.1 Khái niệm chung 91 7.2 Kỹ thuật lập trình RMI theo mơ hình Client/Server 91 7.3 Một số ví dụ 93 DANH MỤC HÌNH ẢNH Hình 1.1: Các giao thức lớp khác mạng Hình 1.2: Các lớp mơ hình TCP/IP Hình 1.3: Cấu trúc IPv4 datagram Hình 1.4: Kết nối lớp thơng qua máy chủ proxy 12 Hình 1.5: Kết nối Client/Server 14 Hình 2.1: Dữ liệu bị khơng flush luồng 18 Hình 2.2: Dịng liệu qua chuỗi filter 24 Hình 3.1: Các trạng thái luồng 37 Hình 3.2: Tạo luồng cách extends từ lớp Thread 41 Hình 3.3: Tạo luồng cách implements từ giao diện Runnable 43 Hình 5.1: Mơ hình Client/Server theo kỹ thuật lập trình với giao thức TCP 72 Hình 5.2: Thiết kế giao diện kiểm tra cổng mạng 73 Hình 5.3: Kết kiểm tra cổng mạng 74 Hình 5.4: Thiết kế giao diện quét cổng mạng 74 Hình 5.5: Kết quét kiểm tra cổng mạng 75 Hình 5.6: Thiết kế giao diện Client xử lý xâu 76 Hình 5.7: Kết xử lý xâu máy chủ TCP 77 Hình 5.8: Thiết kế giao diện Client xử lý số 78 Hình 5.9: Kết xử lý số máy chủ TCP 80 Hình 6.1: Cấu tạo DatagramPacket 83 Hình 6.2: Mơ hình Client/Server theo kỹ thuật lập trình với giao thức UDP 86 Hình 6.3: Thiết kế giao diện xử lý xâu UDP 88 Hình 6.4: Kết xử lý xâu máy chủ UDP 89 Hình 7.1: Mơ hình RMI tổng quát 91 Hình 7.2: Kiến trúc RMI 92 Hình 7.3: Các bước lập trình theo kỹ thuật RMI 93 Hình 7.4: Thiết kế giao diện liệt kê số nguyên tố 95 Hình 7.5: Kết liệt kê số nguyên tố với máy chủ RMI 96 Hình 7.6: Thiết kế giao diện xử lý số RMI 98 Hình 7.7: Kết tìm ước chung lớn hai số 99 Hình 7.8: Kết kiểm tra tính ngun tố hai số 99 Hình 7.9: Thiết kế form xử lý xâu theo kỹ thuật RMI 101 Hình 7.10: Kết chuyển xâu thành in hoa 102 Hình 7.11: Kết đếm số từ xâu 102 chuỗi kí tự dễ nhớ với người, gọi chúng hostname Ví dụ, thay phải nhớ địa 117.6.86.168 nhớ địa utb.edu.vn Mỗi máy chủ phải có hostname Máy khách thường có hostname khơng có địa IP cố định IP cấp phát lại sau lần khởi động Một số thiết bị có nhiều tên Ví dụ, tbit.vn tuhoctin.net nằm máy chủ Linux Cái tên tbit.vn thực tế tới website tên máy chủ cụ thể Trong khứ, website chuyển từ máy chủ tới máy chủ khác tên gán lại máy chủ để trỏ website máy chủ Có trường hợp tên tương ứng với nhiều địa IP Khi đó, máy chủ lựa chọn để phản hồi yêu cầu từ người dùng máy chủ DNS lựa chọn ngẫu nhiên Tính thường sử dụng với website có lượng truy cập lớn nên cần mở rộng hệ thống theo chiều ngang để phân chia lượng người dùng tới nhiều hệ thống máy chủ khác Ví dụ, tên miền google.com.vn thường trỏ tới nhiều máy chủ có địa khác thay đổi theo thời điểm Tất máy tính kết nối tới Internet truy cập thiết bị gọi máy chủ dịch vụ tên miền (máy chủ DNS) Đây máy chủ thực ánh xạ tên miền địa IP Hầu hết máy chủ DNS biết địa máy tính mạng cục số địa mạng khác Nếu máy khách yêu cầu địa máy nằm bên mạng cục bộ, máy chủ DNS mạng cục gửi yêu cầu tới máy chủ DNS mạng khác đợi trả lời để phản hồi lại yêu cầu Hầu lúc sử dụng hostname đợi máy chủ DNS xử lý trả lại địa IP Khi kết nối tới máy chủ DNS, không cần lo lắng việc làm để ánh xạ tên địa IP máy chủ DNS cục hay phận khác Internet Mặc dù vậy, cần truy cập máy chủ DNS muốn thực hành số ví dụ giáo trình Một số ví dụ cần phải kết nối Internet không làm việc máy độc lập Lớp java.net.InetAddress biểu diễn bậc cao địa IP, bao gồm IPv4 IPv6 Lớp dùng hầu hết lớp khác Socket, ServerSocket, URL, DatagramSocket, DatagramPacket… InetAddress bao gồm thông tin hostname địa IP 52 4.1 Khởi tạo đối tượng InetAddress Lớp InetAddress khơng có hàm tạo public Thay vào đó, InetAddress có số phương thức static để kết nối tới máy chủ DNS Phương thức thường dùng InetAddress.getByName() Ví dụ, cách để tạo object để lấy thông tin utb.edu.vn: InetAddress address = InetAddress.getByName("utb.edu.vn"); Ví dụ 4-1 Tạo object lớp InetAddress để đọc thông tin tên miền utb.edu.vn import java.net.*; public class InetGetByName { public static void main (String[] args) { try { InetAddress address = InetAddress.getByName("utb.edu.vn"); System.out.println(address); } catch (UnknownHostException ex) { System.out.println("Khong tim thay!!!"); } } } Kết quả: % java InetGetByName utb.edu.vn/117.6.86.168 Chúng ta sử dụng tham số địa IP Ví dụ, lấy hostname tương ứng với địa IP 117.6.86.168: InetAddress address = InetAddress.getByName("117.6.86.168"); System.out.println(address.getHostName()); Nếu địa IP tìm khơng có hostname tương ứng, getHostName() đơn giản trả địa IP dạng dotted squad Như bên nói, số tên miền tương ứng với nhiều địa IP Phương thức để lấy thông tin tất máy chủ tương ứng getAllByName() Phương thức trả mảng thông tin tương ứng với máy chủ try { InetAddress[] addresses = InetAddress.getAllByName("google.com.vn"); for (InetAddress address : addresses) { System.out.println(address); } } catch (UnknownHostException ex) { System.out.println("Khơng tìm thấy thơng tin"); } 53 Cuối cùng, phương thức getLocalHost() trả thông tin máy cục (máy mà đoạn mã Java thực thi) InetAddress me = InetAddress.getLocalHost(); Phương thức cố gắng kết nối tới máy chủ DNS để lấy thông tin hostname địa IP Trong trường hợp không thành cơng trả địa loopback Địa IP tương ứng với localhost 127.0.0.1 Ví dụ 4-2 Viết chương trình hiển thị thơng tin máy cục import java.net.*; public class MyAddress { public static void main (String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); } catch (UnknownHostException ex) { System.out.println("Khơng tìm thấy!!!"); } } } Đây kết máy tính Trên máy bạn kết khác % java MyAddress Nguyens-MacBook-Pro.local/10.211.55.2 Như thấy kết trên, thấy hostname/IP máy tính chạy chương trình Nếu khơng kết nối tới Internet khơng đặt địa IP tĩnh cho máy tính mình, nhận kết hostname localhost địa IP 127.0.0.1 Nếu biết xác địa IP máy tính, tạo InetAddress sử dụng phương thức InetAddress.getByAddress() Phương thức chứa tham số public static InetAddress getByAddress(byte[] addr) throws UnknownHostException public static InetAddress getByAddress(String hostname, byte[] addr) throws UnknownHostException Phương thức InetAddress.getByAddress() thứ tạo InetAddress với địa IP cho trước mà không cần tham số hostname phương thức thứ hai cần tham số Ví dụ sau tạo InetAddress cho địa 117.6.86.168: byte[] address = {117, 6, 86, (byte) 168}; InetAddress tbit = InetAddress.getByAddress(address); InetAddress tbitWithName = InetAddress.getByAddress("tbit.vn", address); 54 Chú ý giá trị lớn 127 phải chuyển thành kiểu byte Không giống với phương thức khác, hai phương thức khơng đảm bảo máy chủ tồn máy chủ ánh xạ tới địa IP Việc bẫy lỗi throws lớp UnknownHostException kích thước byte khơng phù hợp (khơng phải byte 16 byte) Phương thức hữu dụng thơng tin tên Server khơng có sẵn khơng Ví dụ, khơng thể nhớ tên máy trạm, máy in mạng hay router hệ thống mạng nội có địa IP bao nhiêu, viết chương trình nhỏ để kiểm tra máy bật hệ thống mạng phải quét 254 trường hợp để tìm thiết bị 4.2 Nhớ đệm (caching) Bởi chi phí thời gian cho việc tìm kiếm DNS đắt đỏ (mất vài giây để yêu cầu gửi qua loạt máy chủ có host khơng tìm thấy được), lớp InetAddress lưu kết tìm kiếm vào vùng nhớ đệm Khi có địa host khơng thực tìm kiếm lại chí tạo InetAddress cho host Địa IP host khơng thay đổi chương trình chạy Với kết khơng tốt (như khơng tìm thấy host), lớp InetAddress lưu giữ kết 10 giây Thời gian lưu giữ kết tạm thời điều chỉnh lớp networkaddress.cache.ttl lớp networkaddress.cache.negative.ttl Lớp networkaddress.cache.ttl quy định thời gian tồn truy vấn DNS thành cơng lớp cịn lại quy định thời gian tồn truy DNS khơng thành cơng Nếu cố gắng tìm kiếm host khoảng thời gian quy định cho kết Giá trị -1 đồng nghĩa với việc “không hết hạn” Bên cạnh việc lưu kết vùng nhớ đệm lớp InetAddress, máy cục bộ, máy chủ tên miền cục máy chủ DNS lưu kết vùng nhớ đệm khoảng thời gian định Java can thiệp vào việc lưu giữ kết tạm thời Do đó, nhiều để thay đổi địa IP tương ứng với host (hoặc tên miền) Internet điều xảy Trong khoảng thời gian ấy, chương trình gặp phải lỗi xảy ra, bao gồm ngoại lệ UnknownHostException, NoRouteToHostException ConnectException 55 4.3 Tìm kiếm địa IP Khi gọi phương thức getByName() với tham số địa IP, tạo đối tượng InetAddress tương ứng với địa IP mà không kiểm tra DNS Điều có nghĩa tạo đối tượng InetAddress cho host không thực tồn kết nối tới Hostname đối tượng InetAddress tạo từ xâu chứa địa IP khởi tạo từ xâu Một truy vấn DNS thực diễn có yêu cầu hostname từ đối tượng qua phương thức getHostName() Như tbit.vn xác định từ địa IP 45.117.83.115 Nếu thời điểm hostname yêu cầu tìm kiếm DNS thực hiện, host tương ứng với địa IP khơng thể tìm thấy hostname gán chuỗi IP khai báo Bẫy lỗi UnknownHostException khơng thực Hostname có tính ổn định nhiều so với địa IP Một số dịch vụ chạy hostname nhiều năm đổi địa IP nhiều lần Nêu lựa chọn hostname IP nên chọn hostname, lựa chọn IP hostname khơng có sẵn 4.4 Các phương thức Get Lớp InetAddress chứa bốn phương thức Get để trả lại chuỗi hostname, địa IP dạng chuỗi dạng mảng byte public public public public String String byte[] String getHostName() getCanonicalHostName() getAddress() getHostAddress() Khơng có phương thức setHostName() setAddress() tương ứng, có nghĩa khơng thể thay đổi trường từ bên ngồi gói java.net Điều giúp cho InetAddress bảo vệ tốt Phương thức getHostName() trả xâu chứa tên host với địa IP đại diện cho đối tượng InetAddress Nếu thiết bị tương ứng khơng có hostname bị ngăn chặn vấn đề bảo mật phương thức trả xâu địa IP Ví dụ: InetAddress machine = InetAddress.getLocalHost(); String localhost = machine.getHostName(); Phương thức getCanonicalHostName() tương tự phương thức mạnh chút việc truy vấn DNS Phương thức getHostName() thực gọi DNS khơng chắn hostname Trong phương thức 56 getCanonicalHostName() gọi DNS thay kết trước việc tìm hostname Ví dụ: InetAddress machine = InetAddress.getLocalHost(); String localhost = machine.getCanonicalHostName(); Phương thức getCanonicalHostName() hữu ích bắt đầu với địa IP thay hostname Trong ví dụ dưới, địa IP 45.117.83.115 dùng để tạo InetAddress thơng qua phương thức getByName() sau phương thức getCanonicalHostName() dùng để lấy hostname Ví dụ 4-3 Cho địa chỉ, tìm tên miền (tên host) import java.net.*; public class ReverseTest { public static void main (String[] args) throws UnknownHostException { InetAddress ia = InetAddress.getByName("98.138.219.231"); System.out.println(ia.getCanonicalHostName()); } } Kết trả (tại thời điểm viết): % java ReverseTest media-router-fp1.prod1.media.vip.ne1.yahoo.com Phương thức getHostAddress() trả xâu chứa địa IP tương ứng Ví dụ bên ví dụ việc sử dụng phương thức Ví dụ 4-4 Tìm địa IP máy cục import java.net.*; public class MyAddress { public static void main(String[] args) { try { InetAddress me = InetAddress.getLocalHost(); String dottedQuad = me.getHostAddress(); System.out.println("Địa máy cục bộ: " + dottedQuad); } catch (UnknownHostException ex) { System.out.println("Khơng tìm thấy kết quả."); } } } Kết (khác máy khác kết nối tới mạng khác nhau): % java MyAddress Địa máy cục bộ: 192.168.1.21 Tất nhiên địa IP kết phụ thuộc vào nơi mà đoạn mã thực thi 57 Nếu muốn biết địa IP máy (hiếm dùng) sử dụng phương thức getAddress() Phương thức trả mảng kiểu byte biểu diễn địa IP máy Byte quan trọng (hay byte địa IP) byte Nếu muốn biết chiều dài mảng, sử dụng thuộc tính length mảng (sử dụng để kiểm tra loại địa IPv4 IPv6) InetAddress me = InetAddress.getLocalHost(); byte[] address = me.getAddress(); Chúng ta biết địa IP biểu diễn số nguyên không dấu Nhưng không giống ngôn ngữ C, kiểu byte Java có phạm vi từ -128 đến 127 Có nghĩa số lớn 127 số âm kiểu byte Java Do đó, muốn sử dụng kết kiểu byte trả phương thức getAddress() để làm đó, cần chuyển kiểu byte sang kiểu int cách điều chỉnh thích hợp Ví dụ sau: int unsignedByte = signedByte < ? signedByte + 256 : signedByte; Trong ví dụ trên, signedByte âm dương Phép toán điều kiện ? kiểm tra xem có âm hay khơng Nếu âm, cộng với 256 để trở thành số dương kiểu byte ngược lại giữ nguyên Một lý để sử dụng mảng byte trả phương thức getAddress() để xác định loại địa IPv4 hay IPv6 Ví dụ 4-5 Xác định địa IP v4 hay v6 import java.net.*; public class AddressTests { public static int getVersion(InetAddress ia) { byte[] address = ia.getAddress(); if (address.length == 4) return 4; else if (address.length == 16) return 6; else return -1; } } 4.5 Kiểm tra loại địa Một số địa IP số dải địa IP có ý nghĩa đặc biệt Ví dụ, địa 127.0.0.1 địa loopback Địa loopback, cịn gọi localhost, địa trỏ máy Địa IPv4 phạm vi 224.0.0.0 tới 239.255.255.255 địa multicast dùng để gửi thông điệp tới nhiều host lúc Java có 10 phương thức dùng để xác định loại địa đặc biệt • public boolean isAnyLocalAddress() • public boolean isLoopbackAddress() 58 • public boolean isLinkLocalAddress() • public boolean isSiteLocalAddress() • public boolean isMulticastAddress() • public boolean isMCGlobal() • public boolean isMCNodeLocal() • public boolean isMCLinkLocal() • public boolean isMCSiteLocal() • public boolean isMCOrgLocal() Phương thức isAnyLocalAddress() trả giá trị true địa địa wildcard, ngược lại trả giá trị false Địa wildcard khớp với địa hệ thống mạng cục Điều quan trọng hệ thống có nhiều giao diện mạng, trường hợp hệ thống máy tính có nhiều card Ethernet và/hoặc card WiFi 802.11 Trong IPv4, địa wildcard 0.0.0.0 Trong IPv6, địa wildcard 0:0:0:0:0:0:0:0 (hoặc kí hiệu ∷) Phương thức isLinkLocalAddress() trả giá trị true địa địa IPv6 dạng link-local Đây địa giúp mạng IPv6 tự cấu hình, giống DHCP mạng IPv4 không thiết phải dùng Server mạng Tất địa dạng link-local bắt đầu tám byte FE00:0000:0000:0000 Tám byte địa cục bộ, thường chép thừ địa Ethernet MAC gán nhà sản xuất thiết bị mạng Phương thức isSiteLocalAddress() trả giá trị true địa IPv6 địa site-local Địa loại bắt đầu tám byte FEC0:0000:0000:0000 Tám byte chép từ địa Ethernet MAC Phương thức isMulticastAddress() trả giá trị true địa multicast Những máy có địa gửi nội dung quảng bá tới số định máy khác đăng kí thay gửi cho máy định Trong IPv4, dải địa multicast từ 224.0.0.0 đến 239.255.255.255 Trong IPv6, chúng bắt đầu FF Phương thức isMCGlobal() trả giá trị true địa địa multicast toàn cục (global) Địa multicast toàn cục quảng bá tới máy đăng kí tồn hệ thống mạng tồn cầu Tất địa loại bắt đầu FE Trong IPv6, chúng bắt đầu FF0E FF1E phụ thuộc vào việc địa multicast vĩnh viễn tạm thời Trong IPv4, tất địa IPv4 có phạm vi tồn cầu Phương thức isMCOrgLocal() trả giá trị true địa dạng multicast tổ chức Địa multicast loại địa multicast mà tất máy 59 đăng kí thuộc quan, tổ chức máy từ bên ngồi Địa loại bắt đầu bưởi FF08 FF18 phụ thuộc vào địa multicast vĩnh viễn tạm thời Phương thức isMCSiteLocal() trả giá trị true địa dạng multicast site-wide Những packet tới máy có địa loại truyền mạng cục Địa loại bắt đầu bưởi FF05 FF15 phụ thuộc vào địa multicast vĩnh viễn tạm thời Phương thức isMCLinkLocal() trả giá trị true địa multicast subnet-wide Packet tới địa loại truyền nội mạng (subnet) Địa loại bắt đầu bưởi FF02 FF12 phụ thuộc vào địa multicast vĩnh viễn tạm thời Phương thức isMCNodeLocal() trả giá trị true địa multicast dạng interface-local Packet tới địa loại truyền khỏi giao diện mạng nó, chí khơng thể tới giao diện mạng khác node Địa loại bắt đầu FF01 FF11 phụ thuộc vào địa multicast vĩnh viễn tạm thời Ví dụ 4-6 sau chương trình đơn giản để kiểm tra địa nhập trực tiếp từ cửa sổ lệnh dùng 10 phương thức Ví dụ 4-6 Kiểm tra địa IP đặc trưng import java.net.*; public class IPCharacteristics { public static void main(String[] args) { try { InetAddress address = InetAddress.getByName(args[0]); if (address.isAnyLocalAddress()) { System.out.println(address + " địa wildcard."); } if (address.isLoopbackAddress()) { System.out.println(address + " địa loopback."); } if (address.isLinkLocalAddress()) { System.out.println(address + " địa link-local."); } else if (address.isSiteLocalAddress()) { System.out.println(address + " địa site-local."); } else { System.out.println(address + " địa toàn cục."); } if (address.isMulticastAddress()) { if (address.isMCGlobal()) { System.out.println(address + " địa multicast toàn cục."); 60 } else if (address.isMCOrgLocal()) { System.out.println(address + " địa multicast tổ chức."); } else if (address.isMCSiteLocal()) { System.out.println(address + " địa multicast site-wide."); } else if (address.isMCLinkLocal()) { System.out.println(address + " địa multicast subnet-wide."); } else if (address.isMCNodeLocal()) { System.out.println(address + " địa multicast interface-local."); } else { System.out.println(address + " địa multicast chưa xác định."); } } else { System.out.println(address + " địa unicast."); } } catch (UnknownHostException ex) { System.err.println("Khơng phân tích địa này."); } } } Dưới số kết chạy đoạn mã với địa IPv4 IPv6 khác $ java IPCharacteristics 127.0.0.1 /127.0.0.1 địa loopback /127.0.0.1 địa toàn cục /127.0.0.1 địa unicast $ java IPCharacteristics 192.168.254.32 /192.168.254.32 địa multicast site-wide /192.168.254.32 địa unicast $ java IPCharacteristics www.oreilly.com www.oreilly.com/208.201.239.37 địa toàn cục www.oreilly.com/208.201.239.37 địa unicast $ java IPCharacteristics 224.0.2.1 /224.0.2.1 địa toàn cục /224.0.2.1 địa multicast toàn cục $ java IPCharacteristics FF01:0:0:0:0:0:0:1 /ff01:0:0:0:0:0:0:1 địa toàn cục /ff01:0:0:0:0:0:0:1 địa multicast interface-local $ java IPCharacteristics FF05:0:0:0:0:0:0:101 /ff05:0:0:0:0:0:0:101 địa toàn cục /ff05:0:0:0:0:0:0:101 địa multicast site-wide $ java IPCharacteristics 0::1 /0:0:0:0:0:0:0:1 địa loopback /0:0:0:0:0:0:0:1 địa toàn cục /0:0:0:0:0:0:0:1 địa unicast 61 4.6 Kiểm tra khả kết nối (reachable) Lớp InetAddress có hai phương thức isReachable() để kiểm tra xem nút mạng cụ thể có kết nối từ host khơng Kết nối bị khóa nhiều lí do, firewall, máy chủ proxy, đứt cáp hay host không hoạt động thời điểm thử kết nối public boolean isReachable(int timeout) throws IOException public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException Hai phương thức sử dụng công cụ truy vết traceroute để địa có phản hồi hay khơng Nếu host kiểm tra trả lời thời gian timeout tính mili giây, phương thức trả giá trị true ngược lại trả giá trị false Ngoại lệ IOException gọi xảy lỗi mạng Phương thức thứ hai tham số NetworkInterface để định giao diện mạng sử dụng thời gian tồn ttl (time-to-live) giá trị số lớn xác định thời gian kết nối trước bị bỏ qua 4.7 Các phương thức Object Giống lớp khác Java, java.net.InetAddress kế thừa từ lớp java.lang.Object Vì vậy, lớp kế thừa tất phương thức lớp Lớp InetAddress override ba phương thức sau: • public boolean equals(Object o) • public int hashCode() • public String toString() Hai object lớp InetAddress chúng có địa IP Ví dụ, object InetAddress cho tbit.vn với object cho tuhoctin.net hai tên miền trỏ địa địa IP Ví dụ 4-7 tạo object tương ứng với hai tên miền cho biết chúng địa IP thay đổi Ví dụ 4-7 Kiểm tra tbit.vn tuhoctin.net có địa IP khơng? import java.net.*; public class IBiblioAliases { public static void main(String args[]) { try { InetAddress ibiblio = InetAddress.getByName("tbit.vn"); InetAddress helios = InetAddress.getByName("tuhoctin.net"); if (ibiblio.equals(helios)) { System.out.println("tbit.vn thuộc máy chủ với tuhoctin.net"); 62 } else { System.out.println("tbit.vn không thuộc máy chủ với tuhoctin.net"); } } catch (UnknownHostException ex) { System.out.println("Khơng tìm thấy host tương ứng."); } } } Kết chạy đoạn code thời điểm viết tài liệu này: % java IBiblioAliases tbit.vn thuộc máy chủ với tuhoctin.net Phương thức hashcode() trả số nguyên tương ứng với địa IP Nếu hai object InetAddress địa IP, chúng mã hash code, hostname khác Phương thức toString() trả đoạn văn ngắn mơ tả object Ví dụ 41 Ví dụ 4-2 thực gọi phương thức Kết trả dạng: hostname/địa IP Khơng phải tất object InetAddress có hostname Nếu chúng khơng có hostname, địa IP dùng thay phiên Java 1.3 trở trước, Java 1.4 trở sau trả xâu rỗng 4.8 Inet4Address Inet6Address Java sử dụng hai lớp Inet4Address Inet6Address để phân biệt địa IPv4 địa IPv6 • public final class Inet4Address extends InetAddress • public final class Inet6Address extends InetAddress Hầu hết khi, không thực nên quan tâm tới địa IPv4 hay IPv6 Trong tầng ứng dụng, không cần phải biết điều Nhưng có nhiều cần chúng để làm việc nhanh Lớp Inet4Address override nhiều phương thức lớp InetAddress không thay đổi tới phương thức public Lớp Inet6Address tương tự thêm phương thức khơng có lớp cha: public boolean isIPv4CompatibleAddress() Phương thức trả giá trị địa IPv4 nằm IPv6, có nghĩa có byte cuối khác khơng Do đó, địa IP có dạng 0:0:0:0:0:0:0:xxxx Trong trường hợp tách 63 lấy bốn byte cuối từ phương thức getBytes() để tạo object Inet4Address Tuy nhiên thực điều 4.9 Lớp NetworkInterface Lớp NetwordInterface đại diện cho địa IP cục Nó giao diện mạng vật lý card Ethernet bổ sung (firewall router) hay giao diện mạng ảo thiết bị phần cứng với địa IP khác Lớp NetworkInterface liệt kê tất địa cục tạo object InetAddress tương ứng Những object dùng để tạo socket cho Client Server Một số phương thức Vì object NetworkInterface đại diện cho phần cứng vật lý địa mạng ảo nên có khơng khởi tạo cách tùy tiện Giống lớp InetAddress, có số phương thức dùng để tạo object NetworkInterface với giao diện mạng cụ thể Chúng ta tạo object NetworkInterface từ địa IP, từ hostname enumeration public static NetworkInterface getByName(String name) throws SocketException Phương thức getByName() trả object NetworkInterface từ tên cụ thể Nếu khơng có giao diện mạng tương ứng, trả giá trị null Rất xảy lỗi, có chúng xử lý SocketException Định dạng tên phụ thuộc vào hệ điều hành Trên dòng hệ điều hành Unix, tên giao diện Ethernet có dạng eth0, eth1,… Địa loopback có tên dạng “lo” Trên dòng hệ điều hành Windows, tên chuỗi dạng “CE31” “ELX100” phụ thuộc vào tên Nhà sản xuất dòng sản phẩm phần cứng gắn với giao diện mạng Dưới ví dụ thao tác với NetworkInterface với dòng hệ điều hành Unix: try { NetworkInterface ni = NetworkInterface.getByName("eth0"); if (ni == null) { System.err.println("No such interface: eth0"); } } catch (SocketException ex) { System.err.println("Could not list sockets."); } public static NetworkInterface getByInetAddress(InetAddress address) throws SocketException 64 Phương thức getByInetAddress() trả object NetworkInterface tương ứng với địa IP cụ thể Nếu khơng có giao diện mạng tương ứng máy cục bộ, trả giáo trị null Nếu có lỗi đó, throws SocketException Dưới ví dụ tìm giao diện mạng tương ứng với địa loopback: try { InetAddress local = InetAddress.getByName("127.0.0.1"); NetworkInterface ni = NetworkInterface.getByInetAddress(local); if (ni == null) { System.err.println("That's weird No local loopback address."); } } catch (SocketException ex) { System.err.println("Could not list network interfaces."); } catch (UnknownHostException ex) { System.err.println("That's weird Could not lookup 127.0.0.1."); } public static Enumeration getNetworkInterfaces() throws SocketException Phương thức getNetworkInterfaces() trả đối tượng thuộc lớp java.util.Enumeration liệt kê tất giao diện mạng máy cục Ví dụ 4-8 chương trình đơn giản để liệt kê giao diện mạng máy cục Ví dụ 4-8 Liệt kê giao diện mạng máy cục import java.net.*; import java.util.*; public class InterfaceLister { public static void main(String[] args) throws SocketException { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); System.out.println(ni); } } } Và kết với máy có nhiều kết nối mạng sau: % java InterfaceLister name:eth1 (eth1) index: addresses: /192.168.210.122; name:eth0 (eth0) index: addresses: /152.2.210.122; name:lo (lo) index: addresses: /127.0.0.1; Trong kết thấy máy tính có kết nối mạng thơng qua Ethernet với địa IP 192.168.210.122 152.2.210.122 Địa loopback cho localhost 127.0.0.1 65 CÂU HỎI, BÀI TẬP VẬN DỤNG: Lớp InetAddress Java dùng để làm gì? Các tạo đối tượng thuộc lớp InetAddress Liệt kê phương thức quan trọng lớp InetAddress? Liệt kê loại địa IP cách kiểm tra chúng với Java? Lớp NetworkInterface dùng để làm gì? Nêu phương thức nó? Viết chương trình đọc thơng tin máy cục bộ: hostname, IP…? Viết chương trình tìm địa IP tên miền tên máy mạng? Viết chương trình liệt kê tất IP tương ứng với tên miền? 66 ... Thread-2-Send-Email, Thread: Thread -1 - HR-Database, Thread: Thread -1 - HR-Database, Thread: Thread-2-Send-Email, Thread: Thread-2-Send-Email, Thread: Thread -1 - HR-Database, Thread: Thread-2-Send-Email,... Thread -1 - HR-Database Starting Thread -1 - HR-Database Creating Thread-2-Send-Email Starting Thread-2-Send-Email ==> Main thread stopped!!! 40 Running Thread -1 - HR-Database Running Thread-2-Send-Email... 11 1. 4.3 Tường lửa 11 1. 4.4 Máy chủ proxy 11 1. 4.5 Mơ hình Client/Server 13 CHƯƠNG CÁC DÒNG VÀO-RA (STREAM) 15 2 .1 Các dòng (output stream) 15