Java - Lớp Socket và Ví dụ

Xin chào, các bạn lập trình Java đang học hỏi! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới lập trình mạng bằng cách sử dụng lớp Socket của Java. Là người dạy khoa học máy tính gần gũi của bạn, tôi rất vui mừng được hướng dẫn bạn trong cuộc phiêu lưu này. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - chúng ta sẽ bắt đầu từ cơ bản và dần dần nâng cao. Vậy, hãy mang theo mũ bảo hiểm ảo của bạn, và chúng ta cùng bắt đầu!

Java - Socket Class

Socket là gì?

Trước khi chúng ta nhảy vào mã, hãy hiểu socket là gì. Hãy tưởng tượng bạn đang cố gọi điện thoại cho bạn của bạn. Bạn cần hai thứ: số điện thoại của bạn và điện thoại để gọi. Trong mạng máy tính, socket giống như điện thoại đó - nó là điểm cuối của một kết nối hai chiều giữa hai chương trình chạy trên mạng.

Lớp Socket của Java

Lớp Socket của Java đại diện cho một socket phía client. Nó là một phần của gói java.net và cung cấp cách để các chương trình giao tiếp với các chương trình khác qua mạng.

Khai báo

Để sử dụng lớp Socket, bạn đầu tiên cần nhập nó:

import java.net.Socket;

Constructor

Lớp Socket có nhiều constructor. Dưới đây là những constructor phổ biến nhất:

Constructor Mô tả
Socket() Tạo một socket chưa kết nối
Socket(String host, int port) Tạo một socket và kết nối nó đến máy chủ chỉ định và cổng
Socket(InetAddress address, int port) Tạo một socket và kết nối nó đến địa chỉ IP và cổng

Phương thức

Lớp Socket cung cấp nhiều phương thức để quản lý kết nối và truyền dữ liệu. Dưới đây là một số phương thức quan trọng:

Phương thức Mô tả
connect(SocketAddress endpoint) Kết nối socket này đến máy chủ
getInputStream() Trả về một luồng nhập để đọc byte từ socket này
getOutputStream() Trả về một luồng xuất để ghi byte vào socket này
close() Đóng socket này
isClosed() Trả về xem socket có đóng hay không
isConnected() Trả về xem socket có kết nối hay không

Ví dụ Socket Client

Bây giờ, hãy tạo một client đơn giản để kết nối đến máy chủ và gửi tin nhắn. Đừng lo lắng nếu bạn không hiểu mọi thứ ngay lập tức - chúng ta sẽ phân tích từng bước.

import java.io.*;
import java.net.*;

public class SimpleSocketClient {
public static void main(String[] args) {
try {
// Tạo một socket và kết nối đến máy chủ
Socket socket = new Socket("localhost", 12345);
System.out.println("Kết nối đến máy chủ!");

// Tạo luồng xuất để gửi dữ liệu đến máy chủ
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// Gửi tin nhắn đến máy chủ
out.println("Xin chào, Máy chủ! Đây là tin nhắn từ client.");

// Tạo luồng nhập để nhận dữ liệu từ máy chủ
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// Đọc phản hồi từ máy chủ
String response = in.readLine();
System.out.println("Máy chủ nói: " + response);

// Đóng các kết nối
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Hãy phân tích điều này:

  1. Chúng ta bắt đầu bằng cách nhập các lớp cần thiết cho các hoạt động nhập/xuất và mạng.

  2. Trong phương thức main, chúng ta bao bọc mã của mình trong một khối try-catch để xử lý các IOException có thể xảy ra.

  3. Chúng ta tạo một đối tượng Socket, chỉ định địa chỉ máy chủ ("localhost" trong trường hợp này, có nghĩa là cùng một máy) và số cổng (12345).

  4. Chúng ta tạo một PrintWriter để gửi dữ liệu đến máy chủ qua luồng xuất của socket.

  5. Chúng ta gửi một tin nhắn đến máy chủ sử dụng phương thức println.

  6. Chúng ta tạo một BufferedReader để nhận dữ liệu từ máy chủ qua luồng nhập của socket.

  7. Chúng ta đọc phản hồi từ máy chủ sử dụng phương thức readLine và in nó.

  8. Cuối cùng, chúng ta đóng tất cả các luồng và socket để giải phóng tài nguyên.

Bây giờ, bạn có thể tự hỏi, "Nhưng đợi đã, máy chủ ở đâu?" Câu hỏi tuyệt vời! Để client này hoạt động, chúng ta cần một máy chủ đang lắng nghe trên cùng một cổng. Hãy tạo một máy chủ đơn giản để hoàn chỉnh ví dụ của chúng ta.

import java.io.*;
import java.net.*;

public class SimpleSocketServer {
public static void main(String[] args) {
try {
// Tạo một máy chủ socket
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("Máy chủ đang chờ khách...");

// Chờ một client kết nối
Socket clientSocket = serverSocket.accept();
System.out.println("Khách đã kết nối!");

// Tạo luồng nhập để nhận dữ liệu từ client
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

// Tạo luồng xuất để gửi dữ liệu đến client
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

// Đọc tin nhắn từ client
String message = in.readLine();
System.out.println("Khách nói: " + message);

// Gửi phản hồi đến client
out.println("Tin nhắn đã nhận, cảm ơn bạn!");

// Đóng các kết nối
in.close();
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Mã máy chủ này thực hiện các bước sau:

  1. Tạo một ServerSocket trên cổng 12345.
  2. Chờ một client kết nối sử dụng phương thức accept.
  3. Khi một client kết nối, nó tạo các luồng nhập và xuất.
  4. Đọc tin nhắn từ client và in nó.
  5. Gửi phản hồi zurück client.
  6. Đóng tất cả các kết nối.

Để chạy ví dụ này:

  1. Đầu tiên, chạy lớp SimpleSocketServer.
  2. Sau đó, chạy lớp SimpleSocketClient.

Bạn nên thấy client kết nối với máy chủ, gửi tin nhắn và nhận phản hồi!

Kết luận

Chúc mừng! Bạn vừa tạo xong ứng dụng client-server đầu tiên của mình bằng cách sử dụng socket Java. Đây chỉ là phần nổi của tảng băng khi nói đến lập trình mạng, nhưng nó là một bước khởi đầu tuyệt vời.

Nhớ rằng, socket giống như điện thoại - chúng cho phép các chương trình giao tiếp với nhau qua mạng. Với kiến thức này, bạn có thể bắt đầu xây dựng các ứng dụng mạng phức tạp hơn, như các chương trình chat, trò chơi nhiều người chơi hoặc hệ thống phân tán.

Khi tiếp tục hành trình Java của bạn, đừng quên khám phá các lớp mạng khác như ServerSocket, URL, và URLConnection. Mỗi lớp này mở ra những khả năng mới cho việc tạo ra các ứng dụng mạnh mẽ, kết nối.

Tiếp tục thực hành, 保持好奇心, và chúc bạn lập trình vui vẻ!

Credits: Image by storyset