Lập trình mạng với Java đã trở nên rất phổ biến trong việc xây dựng các ứng dụng kết nối và tương tác giữa các thiết bị. Trong bài viết này, chúng ta sẽ tìm hiểu về cách lập trình mạng với Java và các giao thức truyền thông quan trọng như TCP và UDP.
Lập trình mạng với Java: Gói java.net
Gói java.net trong J2SE APIs cung cấp một tập hợp các lớp và giao tiếp cho việc truyền thông ở mức độ thấp. Trong lập trình mạng với Java, chúng ta thường sử dụng hai giao thức mạng phổ biến là TCP và UDP.
Giao thức TCP
TCP (Transmission Control Protocol) là một giao thức truyền thông đáng tin cậy trong mạng internet. Giao thức TCP cho phép giao tiếp tin cậy giữa hai ứng dụng. TCP/IP là sự kết hợp giữa giao thức TCP và giao thức Internet Protocol (IP).
Giao thức UDP
UDP (User Datagram Protocol) là một giao thức cho phép truyền dữ liệu giữa các ứng dụng mà không thực hiện việc kiểm tra thông tin gói tin đã được gửi hay chưa. Do đó, giao tiếp bằng UDP là giao tiếp không đáng tin cậy giữa hai hoặc nhiều ứng dụng.
TCP và UDP là hai giao thức cốt lõi trong việc kết nối các thiết bị trong mạng. Ngoài ra, trong lập trình mạng với Java, chúng ta cũng có thể sử dụng các công nghệ như FTP hay J2EE để tương tác và truyền thông dữ liệu.
Lập trình Socket với Java
Socket là một khái niệm cung cấp cơ chế truyền thông giữa hai máy tính bằng giao thức TCP. Một máy khách tạo ra socket để kết nối với máy chủ.
Trong lập trình mạng với Java, lớp java.net.Socket đại diện cho một socket, trong khi lớp java.net.ServerSocket cung cấp một cơ chế cho chương trình máy chủ để lắng nghe và thiết lập kết nối với máy khách.
Các bước thiết lập kết nối TCP giữa hai máy tính sử dụng socket như sau:
- Máy chủ khởi tạo một đối tượng ServerSocket với một cổng giao tiếp (port).
- Máy chủ gọi phương thức accept() của lớp ServerSocket để chờ máy khách kết nối đến trên cổng đã chỉ định.
- Trong khi máy chủ đang chờ đợi, máy khách khởi tạo đối tượng Socket với địa chỉ máy chủ và số cổng để kết nối.
- Đối tượng Socket của máy khách cố gắng kết nối tới máy chủ đã chỉ định và số cổng. Nếu kết nối thành công, máy khách sẽ có một đối tượng Socket để giao tiếp với máy chủ.
- Ở phía máy chủ, phương thức accept() trả về một tham chiếu đến một socket mới trên máy chủ, được kết nối với socket của máy khách.
Sau khi kết nối được thiết lập, máy chủ và máy khách có thể truyền và nhận thông tin thông qua OutputStream và InputStream.
Lớp ServerSocket trong Java
Lớp java.net.ServerSocket được sử dụng bởi các ứng dụng máy chủ để tạo một cổng và lắng nghe các yêu cầu từ máy khách.
Có một số constructor quan trọng của lớp ServerSocket:
- public ServerSocket(int port) throws IOException: Tạo một ServerSocket ràng buộc vào cổng được chỉ định.
- public ServerSocket(int port, int backlog) throws IOException: Tương tự như constructor trước đó, nhưng cho phép xác định số lượng máy khách đến để lưu trữ trong hàng đợi.
- public ServerSocket(int port, int backlog, InetAddress address) throws IOException: Tương tự như constructor trước đó, nhưng cho phép xác định địa chỉ IP cục bộ để ràng buộc.
- public ServerSocket() throws IOException: Tạo một ServerSocket không kết nối. Sử dụng phương thức
bind()
để ràng buộc socket của máy chủ khi sẵn sàng.
Các phương thức quan trọng của lớp ServerSocket:
- public int getLocalPort(): Trả về cổng mà socket của máy chủ lắng nghe.
- public Socket accept() throws IOException: Chờ cho một khách hàng kết nối.
- public void setSoTimeout(int timeout): Thiết lập thời gian chờ cho socket của máy chủ khi chờ đợi khách hàng.
- public void bind(SocketAddress host, int backlog): Liên kết socket với máy chủ và cổng được chỉ định trong đối tượng
SocketAddress
.
Lớp Socket trong Java
Lớp java.net.Socket đại diện cho socket mà cả máy khách và máy chủ sử dụng để truyền thông giữa nhau. Máy khách nhận được một đối tượng Socket bằng cách khởi tạo, trong khi máy chủ lấy một đối tượng Socket từ giá trị trả về của phương thức accept().
Có một số constructor quan trọng của lớp Socket:
- public Socket(String host, int port) throws UnknownHostException, IOException: Kết nối đến máy chủ và cổng được chỉ định.
- public Socket(InetAddress host, int port) throws IOException: Tương tự như constructor trước đó, nhưng sử dụng địa chỉ IP thay vì tên máy chủ.
- public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException: Kết nối đến máy chủ và cổng được chỉ định, tạo một socket trên máy chủ cục bộ tại địa chỉ và cổng được chỉ định.
- public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException: Tương tự như constructor trước đó, nhưng sử dụng địa chỉ IP thay vì tên máy chủ.
- public Socket(): Tạo một socket không kết nối. Sử dụng phương thức
connect()
để kết nối socket này với máy chủ.
Các phương thức quan trọng của lớp Socket:
- public void connect(SocketAddress host, int timeout) throws IOException: Kết nối socket với máy chủ được chỉ định.
- public InetAddress getInetAddress(): Trả về địa chỉ IP của máy tính mà socket này được kết nối.
- public int getPort(): Trả về cổng mà socket bị ràng buộc trên máy remote.
- public int getLocalPort(): Trả về cổng mà socket bị ràng buộc trên máy local.
- public SocketAddress getRemoteSocketAddress(): Trả về địa chỉ socket từ xa.
- public InputStream getInputStream() throws IOException: Trả về input stream của socket.
- public OutputStream getOutputStream() throws IOException: Trả về output stream của socket.
- public void close() throws IOException: Đóng socket, làm cho đối tượng Socket này không còn có khả năng kết nối với máy chủ nào khác.
Lớp InetAddress và các phương thức hữu ích
Lớp java.net.InetAddress đại diện cho một địa chỉ giao thức Internet (IP). Dưới đây là một số phương thức hữu ích trong lớp InetAddress:
- static InetAddress getByAddress(byte[] addr): Trả về đối tượng InetAddress với địa chỉ IP.
- static InetAddress getByAddress(String host, byte[] addr): Tạo một InetAddress từ tên máy chủ và địa chỉ IP.
- static InetAddress getByName(String host): Xác định địa chỉ IP của máy chủ từ tên máy chủ.
- String getHostAddress(): Trả về chuỗi địa chỉ IP.
- String getHostName(): Lấy tên máy chủ cho địa chỉ IP này.
- static InetAddress getLocalHost(): Trả về máy chủ local.
- String toString(): Chuyển địa chỉ IP thành một chuỗi.
Ví dụ lập trình Socket
Dưới đây là một ví dụ về chương trình client và chương trình server sử dụng lớp Socket để tạo kết nối và truyền thông giữa hai máy tính:
- Ví dụ về Socket Client: ClientExample
- Ví dụ về Socket Server: ServerExample
Kết luận
Trên đây là những kiến thức cơ bản về lập trình mạng với Java, và cách sử dụng lớp Socket và ServerSocket để tạo kết nối và truyền thông giữa các máy tính. Hi vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan về lập trình mạng với Java và giúp bạn nắm bắt các khái niệm cơ bản của nó.
Để tìm hiểu thêm về lập trình mạng với Java, bạn có thể tham khảo tài liệu và ví dụ chi tiết trên trang web của Java hoặc trong các sách chuyên ngành. Chúc bạn thành công trong việc học và ứng dụng lập trình mạng với Java!