Lập trình mạng - Chương 5: Lập trình mạng với Java
Giới thiệu gói thư viện Java.net
Sử dụng TCP socket
Sử dụng UDP socket
RMI và kỹ thuật phân tán đối tượng
Tóm tắt nội dung Lập trình mạng - Chương 5: Lập trình mạng với Java, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
,int port): tạo đối tượng socket kết nối đến address và port. • Socket(String hostName, int port, boolean stream): tạo đối tượng socket kết nối đến hostName và port, stream=true nếu qui định kết nối theo TCP, stream=false nếu qui định kết nối theo UDP. Tuy nhiên nếu sử dụng socket theo UDP thì nên sử dụng lớp DatagramSocket. Lớp Socket(tt) Các phương thức thường được sử dụng: • InputStream getInputStream() : lấy luồng nhập để có thể nhận dữ liệu từ máy ở xa. • OutputStream getOutputStream(): lấy luồng xuất để có thể gửi dữ liệu đến máy ở xa. 7 • InetAddress getInetAddress(): trả về đối tượng InetAddress chứa địa chỉ của máy đang kết nối đến. • int getPort(): trả về số hiệu cổng sử dụng của máy đang kết nối. • void close(): đóng socket, cắt kết nối. Lớp Socket(tt)-Ví dụ try{ //Kết nối đến máy chủ Socket mySocket=new Socket(“www.hcmutrans.edu.vn”,8080); //Luồng nhâp để nhận dữ liệu DataInputStream inStream=new DataInputStream(mySocket.getInputStream()); //Luồng xuất để gửi dữ liệu DataOutputStream outStream=new DataOutputStream(mySocket.getOutputStream()); 8 //Bắt đầu gửi nhận dữ liệu qua inStream và outStream … } catch(Exception e){ System.out.println(e); } Lớp ServerSocket Sử dụng cho server, tạo socket và lắng nghe kết nối trên một port Hàm tạo và các phương thức: • ServerSocket(int port): tạo đối tượng socket và lắng 9 nghe ở port. • Socket accept(): dừng lại và đợi client kết nối đến, khi nhận được thông tin kết nối sẽ trả về đối tượng Socket kết nối với client. • void close(): cắt kết nối và đóng socket. Lớp ServerSocket(tt)-Ví dụ try{ //Tạo serverSocket lắng nghe ở cổng 12345 ServerSocket server=new ServerSocket(12345); //Chờ client kết nối đến Socket client=server.accept(); 10 //Tạo InputStream và OutputStream qua socket client // và bắt đầu gửi nhận dữ liệu… } catch(Exception e){ System.out.println(e); } Lớp DatagramSocket Sử dụng giao thức UDP, truyền nhận dữ liệu dưới dạng gói tin. Hàm tạo và các phương thức: • DatagramSocket(): tạo đối tượng socket sử dụng giao thức 11 UDP. • DatagramSocket(int port): tạo đối tượng socket và kết nối đến số hiệu cổng port. • void send(DatagramPacket p): gửi gói tin p đi. • void receive(DatagramPacket p): nhận gói tin p về. • void close(): đóng socket. Lớp DatagramPacket Khai báo gói tin gửi đi trên mạng qua kết nối DatagramSocket. Hàm tạo và các phương thức: • DatagramPacket(byte buffer[], int len): tạo gói tin có dữ liệu chứa trong buffer, chiều dài buffer là len. 12 • DatagramPacket(byte buffer[], int len, InetAddress dest, int port): tạo gói tin gửi đến địa chỉ dest với số hiệu cổng port. • InetAddess getAddress(): lấy địa chỉ chứa trong gói tin. • int getPort(): lấy số hiệu cổng chứa trong gói tin. • byte[] getData(): lấy dữ liệu trong gói tin. • int getLength(): lấy chiều dài gói dữ liệu. Lớp DatagramSocket & DatagramPacket(tt)-Ví dụ try{ //Tạo socket UDP kết nối với cổng 2345 DatagramSocket socket=new DatagramSocket(2345); //Khai báo Buffer gửi nhận byte outBuffer[]; byte inBuffer[]=new byte[256]; //Khai báo Datagram Packet để gửi và nhận DatagramPacket outDatagram; 13 DatagramPacket inDatagram=new DatagramPacket(inBuffer,inBuffer.length); //Bắt đầu gửi nhận dữ liệu … // nhận dữ liệu: socket.receive(inDatagram); // … xử lý dữ liệu ở inBuffer // chuẩn bị dữ liệu trong outDatagram // gửi dữ liệu: socket.send(outDatagram); //…… } catch(Exception e){ System.out.println(e); } Lớp URL URL(Uniform Resource Locator): sử dụng để định vị tài nguyên mạng. Hàm tạo và các phương thức: • URL(String s): tạo đối tượng URL từ địa chỉ s là một chuỗi. : lấy về nội dung từ địa chỉ URL có 14 • Object getContent() được. • String getFile(): lấy về tên tập tin nằm trong chuỗi địa chỉ URL. • String getHost(): lấy tên máy chủ. • int getPort(): lấy số hiệu cổng. • InputStream openStream(): mở luồng để đọc thông tin từ máy chủ. Lớp URL-Ví dụ try{ //Tạo URL kết nối đến trang web URL url=new URL(““); //Tạo luồng nhập để đọc dữ liệu BufferReader inStream=new BufferReader(new InputStreamReader(url.openStream())); //In nội dung trang index.htm ra màn hình … 15 String s; while ((s=inStream.readLine())!=null){ System.out.println(s); } } catch(Exception e){ System.out.println(e); } Sử dụng TCP socket Server: tạo một đối tượng ServerSocket lắng nghe đến một số hiệu cổng nào đó. Client: tạo một đối tượng Socket kết nối với server qua tên/địa chỉ IP và số hiệu cổng. 16 Tham khảo hai ví dụ: TimeServer/TimeClient: server phục vụ truy vấn ngày giờ. CalServer/CalClient: Server phục vụ chức năng tính toán. Sử dụng UDP socket Server: tạo một đối tượng DatagramSocket lắng nghe đến một số hiệu cổng nào đó. Client: tạo một đối tượng DatagramSocket và gửi dữ liệu đến server qua địa chỉ và 17 cổng đã được biết trước. Server gửi trả dữ liệu qua địa chỉ và cổng của client chứa trong gói tin này. Tham khảo ví dụ: CurrencyServer/CurrencyClient: server phục vụ truy vấn giá cả ngoại tệ. RMI và kỹ thuật lập trình phân tán đối tượng Khái niệm lập trình phân tán đối tượng Thiết kế ứng dụng phân tán RMI Vấn đề truyền tham số 18 Kết nối mạng và vấn đề tường lửa(firewall) SOAP Khái niệm lập trình phân tán đối tượng Các đối tượng nằm phân tán trên các máy vật lý khác nhau. Đối tượng có thể triệu gọi phương thức của đối tượng nằm trên một máy khác – triệu 19 gọi từ xa. RMI (Remote method Invoke): là cách thức giao tiếp của các đối tượng Java có mã lệnh cài đặt nằm trên các máy khác nhau có thể triệu gọi lẫn nhau. Khái niệm lập trình phân tán đối tượng(tt) Computer A A1 A2 + A1, A2 là các đối tượng trên máy A + B1 là đối tượng trên máy B + C1,C2,C3 là các đối tượng trên máy C 20 Computer B B1 A2 Computer C C1 C2 C3 Gọi phương thức từ xa và các vấn đề phát sinh Các đối tượng nằm trên các máy khác nhau, có không gian địa chỉ khác nhau nên việc tham chiếu biến hay địa chỉ là khác nhau. Ví dụ khi truyền tham số là con trỏ cho một phương thức gọi từ xa, ở máy này con trỏ tồn 21 tại, nhưng ở máy ở xa, có thể chưa có vùng nhớ nào đã cấp phát dành cho con trỏ này. Lời gọi phương thức cục bộ luôn trả về kết quả, trong khi gọi phương thức từ xa thông qua kết nối mạng và có thể bị ngắt ngang do mạng có sự cố. Lớp trung gian: Stub & Skeleton Để giải quyết vấn đề trên, Java không cho phép gọi phương thức từ xa trực tiếp mà thông qua lớp trung gian Lớp trung gian tồn tại ở cả máy gọi 22 và máy được gọi. Máy gọi cần lớp trung gian là Stub Máy được gọi cần lớp trung gian là Skeleton Stub & Skeleton Computer A A1 A2 B1_Stub C 1 _ S tu b Computer C A2 C 1 _ S keleton 23 C 1 _ S keleton Computer B B1 B1_Skeleton Xây dựng ứng dụng phân tán RMI Ví dụ xây dựng ứng dụng CalculatorServer/Client Calculator: lớp có phương thức sẽ được gọi từ xa. CalculatorClient: lớp sử dụng các phương thức của Calculator CalculatorServer: lớp sẽ đăng ký Calculator để có thể gọi từ xa 24 Computer A CalculatorClient C alcu lator_ S tu b Computer B Calculator C alcu lator_ S kel RMI B1. Tạo interface Calculator Interface Calculator cần kế thừa lớp Remote để có thể gọi được từ xa File Calculator.java có nội dung như sau import java.rmi.*; 25 public interface Calculator extends Remote{ public int sum(int n); // sum = 1+2+3+…+n } //Chỉ khai báo các phương thức và //đối số, không có nội dung. B2. Tạo lớp CalculatorImpl hiện thực interface Calculator File CalculatorImpl.java có nội dung: import java.rmi.*; public class CalculatorImpl implements Calculator{ public int sum(int n){ 26 int s=0; for (int i=1;i<n;i++) s=s+i; return s; } } B3. Dịch thành các file class, tạo Stub & Skeleton C:\>javac Calculator.java C:\>javac CalculatorImpl.java C:\>rmic CalculatorImpl 27 Kết quả quá trình dịch được các file: Calculator.class CalculatorImpl.class CalculatorImpl_Stub.class CalculatorImpl_Skel.class B4. Xây dựng CalculatorServer.java để cài đặt đối tượng Calculator import java.rmi.server.*; import java.rmi.*; public class CalculatorServer{ public static void main(String args[]){ try{ CalculatorImpl c=new CalculatorImpl(); 28 System.out.println("Exporting Calculator..."); UnicastRemoteObject.exportObject(c); Naming.bind("rmi://localhost/MyCalculator",c); System.out.println("Register Calculator!"); }catch(Exception e){ System.out.println(e); } } } B5. Thực thi bộ đăng ký đối tượng rmiregistry.exe Chức năng của bộ đăng ký là đón nhận các kết nối chứa thông tin về đối tượng do phương thức Naming.bind() gửi đến. Kích hoạt bộ đăng ký: 29 C:\jsdk\bin\rmiregistry.exe Kích hoạt CalculatorServer: java CalculatorServer B6. Xây dựng CalculatorClient.java sử dụng đối tượng Calculator import java.rmi.*; public class CalculatorClient{ public static void main(String args[]){ try{ System.out.println("Finding Object..."); Calculator c=(Calculator)Naming.lookup("rmi://localhost/MyCalculator"); //Test c 30 System.out.println("Sum(12)= " + c.sum(12)); }catch(Exception e){ System.out.println(e); } } } Triển khai ứng dụng Trên Server cần các file sau: Calculator.class CalculatorImpl.class CalculatorImpl_Skel.class 31 CalculatorImpl_Stub.class CalculatorServer.class Trên Client cần các file sau: Calculator.class CalculatorImpl_Stub.class CalculatorClient.class Truyền tham số trong các lời gọi phương thức từ xa Tham số: tham trị và tham biến Tham số trong RMI: Các kiểu dữ liệu đơn giản như: int, char, float,… được truyền theo tham trị. 32 Các đối tượng muốn truyền qua mạng phải cài đặt giao tiếp Remote hoặc Serializable. Đối tượng cài đặt Remote sẽ truyền tham biến, cài đặt theo Serializable truyền theo tham trị.
File đính kèm:
- Lập trình mạng - Chương 5_Lập trình mạng với Java.pdf