Java Networking

6 minute read

XII. Java Networking:

A. Cơ bản về TCP/IP và Socket Programming:

  1. TCP/IP:

    • TCP/IP (Transmission Control Protocol/Internet Protocol) là một bộ giao thức mạng được sử dụng rộng rãi trong Internet.
    • TCP là một giao thức kết nối đáng tin cậy, đảm bảo việc truyền dữ liệu một cách an toàn và không mất mát.
    • IP là một giao thức định tuyến, quản lý việc chuyển tiếp dữ liệu giữa các thiết bị mạng trên Internet.
  2. Socket Programming:

    • Socket là một giao diện để truyền dữ liệu giữa các máy tính qua mạng.
    • Socket Programming là quá trình tạo ra các kết nối giữa các máy tính thông qua việc sử dụng socket để truyền và nhận dữ liệu.
    • Trong Java, bạn có thể sử dụng gói java.net để lập trình socket.
  3. Các loại socket:

    • ServerSocket: Được sử dụng để tạo ra một server và lắng nghe các yêu cầu kết nối từ các client.
    • Socket: Được sử dụng để tạo ra một kết nối từ client đến server.
  4. Ví dụ về Socket Programming:

    • Dưới đây là một ví dụ đơn giản về việc sử dụng Java để viết một server và một client sử dụng TCP/IP và socket:

      Server:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      
      import java.net.*;
      import java.io.*;
      
      public class Server {
          public static void main(String[] args) throws IOException {
              ServerSocket serverSocket = new ServerSocket(12345); // Mở cổng 12345
      
              System.out.println("Server is running...");
              Socket clientSocket = serverSocket.accept(); // Chấp nhận yêu cầu từ client
      
              PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
              BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      
              String inputLine;
              while ((inputLine = in.readLine()) != null) {
                  System.out.println("Received: " + inputLine);
                  out.println("Server received: " + inputLine);
              }
      
              out.close();
              in.close();
              clientSocket.close();
              serverSocket.close();
          }
      }
      

      Client:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
      import java.net.*;
      import java.io.*;
      
      public class Client {
          public static void main(String[] args) throws IOException {
              Socket socket = new Socket("localhost", 12345); // Kết nối đến server localhost:12345
      
              PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
              BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
      
              String userInput;
              while ((userInput = stdIn.readLine()) != null) {
                  out.println(userInput); // Gửi dữ liệu từ client đến server
                  System.out.println("Server response: " + in.readLine()); // Nhận phản hồi từ server
              }
      
              out.close();
              in.close();
              stdIn.close();
              socket.close();
          }
      }
      
    • Trong ví dụ trên, server lắng nghe trên cổng 12345 và client kết nối đến địa chỉ localhost:12345. Sau đó, client và server truyền dữ liệu giữa nhau qua kết nối socket đã thiết lập.

B. Xử lý kết nối mạng trong Java:

Trong lập trình Java, bạn có thể xử lý kết nối mạng thông qua các lớp và giao diện được cung cấp trong gói java.net. Dưới đây là một số cách phổ biến để xử lý kết nối mạng trong Java:

  1. Địa chỉ IP và InetAddress:

    • Lớp InetAddress trong Java biểu diễn một địa chỉ IP.
    • Bạn có thể sử dụng phương thức getByName() của lớp InetAddress để tạo một đối tượng InetAddress từ một chuỗi địa chỉ IP hoặc tên máy chủ.
  2. Socket và ServerSocket:

    • SocketServerSocket là hai lớp quan trọng để xử lý kết nối mạng trong Java.
    • Socket được sử dụng để thiết lập kết nối với một máy chủ qua một cổng cụ thể.
    • ServerSocket được sử dụng để lắng nghe các yêu cầu kết nối từ các client trên một cổng cụ thể.
  3. URL và URLConnection:

    • Lớp URL trong Java biểu diễn một địa chỉ URL.
    • Bạn có thể sử dụng URL để tạo một đối tượng URLConnection để mở kết nối tới địa chỉ URL và truyền/nhận dữ liệu.
  4. HTTP Client và HTTP Server:

    • Java cung cấp các lớp và giao diện để xử lý giao thức HTTP, như HttpClientHttpServer.
    • Bạn có thể sử dụng HttpClient để gửi các yêu cầu HTTP đến máy chủ và nhận phản hồi, trong khi HttpServer cho phép bạn tạo một máy chủ HTTP trong ứng dụng của mình.
  5. DatagramSocket và DatagramPacket:

    • DatagramSocketDatagramPacket được sử dụng để gửi và nhận dữ liệu dưới dạng gói tin không đảm bảo tính toàn vẹn và độ tin cậy (UDP).
    • UDP thích hợp cho các ứng dụng cần tốc độ truyền dữ liệu cao như truyền tải âm thanh và video trực tiếp.
  6. MulticastSocket:

    • MulticastSocket được sử dụng để tham gia vào một nhóm multicast và nhận dữ liệu từ các máy chủ multicast trong nhóm đó.
  7. Proxy và Authenticator:

    • Java cung cấp hỗ trợ cho việc sử dụng proxy trong kết nối mạng thông qua lớp Proxy và giao diện Authenticator.
  8. SSL và TLS:

    • Java cung cấp các lớp và giao diện để hỗ trợ kết nối mạng an toàn qua SSL (Secure Sockets Layer) và TLS (Transport Layer Security).

Kết nối mạng trong Java cung cấp một loạt các công cụ và khả năng để phát triển các ứng dụng mạng đa dạng và linh hoạt. Bạn có thể sử dụng các lớp và giao diện được cung cấp trong gói java.net để tạo và quản lý kết nối mạng một cách hiệu quả.

C. Thực hành một ứng dụng mạng đơn giản

Để thực hành và hiểu rõ hơn về lập trình mạng trong Java, dưới đây là một ví dụ về việc tạo một ứng dụng chat đơn giản sử dụng TCP socket.

Ví dụ: Ứng dụng chat đơn giản sử dụng Java Socket

Ứng dụng này bao gồm hai phần: một phần client và một phần server. Client gửi tin nhắn đến server, server nhận tin nhắn và gửi lại cho tất cả các client khác.

1. Server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer {
    private static final int PORT = 12345;
    private static Set<PrintWriter> clients = new HashSet<>();

    public static void main(String[] args) throws IOException {
        System.out.println("Server is running...");
        ServerSocket serverSocket = new ServerSocket(PORT);
        try {
            while (true) {
                new ClientHandler(serverSocket.accept()).start();
            }
        } finally {
            serverSocket.close();
        }
    }

    private static class ClientHandler extends Thread {
        private Socket socket;
        private PrintWriter out;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                out = new PrintWriter(socket.getOutputStream(), true);
                clients.add(out);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String message;
                while ((message = in.readLine()) != null) {
                    System.out.println("Received: " + message);
                    broadcast(message);
                }
            } catch (IOException e) {
                System.out.println(e);
            } finally {
                if (out != null) {
                    clients.remove(out);
                }
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static void broadcast(String message) {
        for (PrintWriter client : clients) {
            client.println(message);
        }
    }
}

2. Client:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatClient {
    private static final String SERVER_ADDRESS = "localhost";
    private static final int PORT = 12345;

    public static void main(String[] args) throws IOException {
        try (
            Socket socket = new Socket(SERVER_ADDRESS, PORT);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            Scanner scanner = new Scanner(System.in)
        ) {
            System.out.println("Connected to server. Type your message:");
            String userInput;
            while ((userInput = scanner.nextLine()) != null) {
                out.println(userInput);
                String serverResponse = in.readLine();
                System.out.println("Server response: " + serverResponse);
            }
        }
    }
}

Hướng dẫn:

  • Chạy ChatServer trước để khởi động server.
  • Tiếp theo, chạy một hoặc nhiều ChatClient để kết nối tới server.
  • Nhập tin nhắn từ client và nhận phản hồi từ server.

Lưu ý rằng ví dụ này chỉ là một ứng dụng chat đơn giản và không được bảo mật. Trong thực tế, bạn cần thêm các tính năng bảo mật như xác thực và mã hóa dữ liệu khi phát triển ứng dụng thực tế.