Java - Mạng

Thuật ngữ lập trình mạng dùng để chỉ việc viết các chương trình thực thi trên nhiều thiết bị (máy tính), trong đó các thiết bị được kết nối với nhau bằng một mạng.

Gói java.net của các API J2SE chứa một tập hợp các lớp và giao diện cung cấp các chi tiết giao tiếp cấp thấp, cho phép bạn viết các chương trình tập trung vào giải quyết vấn đề trong tầm tay.

Gói java.net cung cấp hỗ trợ cho hai giao thức mạng phổ biến -

  • TCP- TCP là viết tắt của Transmission Control Protocol, cho phép giao tiếp đáng tin cậy giữa hai ứng dụng. TCP thường được sử dụng qua Giao thức Internet, được gọi là TCP / IP.

  • UDP - UDP là viết tắt của User Datagram Protocol, một giao thức không cần kết nối cho phép các gói dữ liệu được truyền giữa các ứng dụng.

Chương này giúp bạn hiểu rõ về hai chủ đề sau:

  • Socket Programming - Đây là khái niệm được sử dụng rộng rãi nhất trong Mạng và nó đã được giải thích rất chi tiết.

  • URL Processing- Điều này sẽ được đề cập riêng. Nhấp vào đây để tìm hiểu về Xử lý URL bằng ngôn ngữ Java.

Lập trình Socket

Sockets cung cấp cơ chế giao tiếp giữa hai máy tính sử dụng TCP. Một chương trình khách tạo một ổ cắm trên đầu giao tiếp của nó và cố gắng kết nối ổ cắm đó với một máy chủ.

Khi kết nối được thực hiện, máy chủ sẽ tạo một đối tượng socket trên phần cuối của giao tiếp. Máy khách và máy chủ hiện có thể giao tiếp bằng cách ghi và đọc từ socket.

Lớp java.net.Socket đại diện cho một socket và lớp java.net.ServerSocket cung cấp một cơ chế để chương trình máy chủ lắng nghe các máy khách và thiết lập kết nối với chúng.

Các bước sau xảy ra khi thiết lập kết nối TCP giữa hai máy tính sử dụng ổ cắm:

  • Máy chủ khởi tạo đối tượng ServerSocket, biểu thị giao tiếp số cổng nào sẽ xảy ra.

  • Máy chủ gọi phương thức accept () của lớp ServerSocket. Phương pháp này đợi cho đến khi một máy khách kết nối với máy chủ trên cổng nhất định.

  • Sau khi máy chủ chờ, một máy khách khởi tạo một đối tượng Socket, chỉ định tên máy chủ và số cổng để kết nối.

  • Hàm tạo của lớp Socket cố gắng kết nối máy khách với máy chủ được chỉ định và số cổng. Nếu giao tiếp được thiết lập, máy khách bây giờ có một đối tượng Socket có khả năng 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 ổ cắm mới trên máy chủ được kết nối với ổ cắm của máy khách.

Sau khi các kết nối được thiết lập, giao tiếp có thể xảy ra bằng cách sử dụng các luồng I / O. Mỗi socket có cả OutputStream và InputStream. OutputStream của khách hàng được kết nối với InputStream của máy chủ và InputStream của khách được kết nối với OutputStream của máy chủ.

TCP là một giao thức truyền thông hai chiều, do đó dữ liệu có thể được gửi qua cả hai luồng cùng một lúc. Sau đây là các lớp hữu ích cung cấp tập hợp đầy đủ các phương thức để triển khai các socket.

Phương thức lớp ServerSocket

Các java.net.ServerSocket lớp được các ứng dụng máy chủ sử dụng để lấy một cổng và lắng nghe các yêu cầu của máy khách.

Lớp ServerSocket có bốn hàm tạo:

Sr.No. Phương pháp & Mô tả
1

public ServerSocket(int port) throws IOException

Cố gắng tạo một ổ cắm máy chủ được liên kết với cổng được chỉ định. Một ngoại lệ xảy ra nếu cổng đã bị ràng buộc bởi một ứng dụng khác.

2

public ServerSocket(int port, int backlog) throws IOException

Tương tự như hàm tạo trước đó, tham số backlog chỉ định số lượng máy khách đến để lưu trữ trong hàng đợi.

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

Tương tự như phương thức khởi tạo trước đó, tham số InetAddress chỉ định địa chỉ IP cục bộ để liên kết. InetAddress được sử dụng cho các máy chủ có thể có nhiều địa chỉ IP, cho phép máy chủ chỉ định địa chỉ IP nào của nó để chấp nhận các yêu cầu của máy khách.

4

public ServerSocket() throws IOException

Tạo một ổ cắm máy chủ không liên kết. Khi sử dụng hàm tạo này, hãy sử dụng phương thức bind () khi bạn đã sẵn sàng liên kết socket máy chủ.

Nếu phương thức khởi tạo ServerSocket không đưa ra ngoại lệ, điều đó có nghĩa là ứng dụng của bạn đã liên kết thành công với cổng được chỉ định và sẵn sàng cho các yêu cầu của khách hàng.

Sau đây là một số phương thức phổ biến của lớp ServerSocket:

Sr.No. Phương pháp & Mô tả
1

public int getLocalPort()

Trả về cổng mà ổ cắm máy chủ đang nghe. Phương pháp này hữu ích nếu bạn đã chuyển 0 làm số cổng trong hàm tạo và để máy chủ tìm cổng cho bạn.

2

public Socket accept() throws IOException

Chờ một khách hàng đến. Phương thức này chặn cho đến khi một máy khách kết nối với máy chủ trên cổng được chỉ định hoặc ổ cắm hết thời gian chờ, giả sử rằng giá trị thời gian chờ đã được đặt bằng phương thức setSoTimeout (). Nếu không, phương thức này chặn vô thời hạn.

3

public void setSoTimeout(int timeout)

Đặt giá trị thời gian chờ cho khoảng thời gian ổ cắm máy chủ chờ máy khách trong quá trình chấp nhận ().

4

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. Sử dụng phương pháp này nếu bạn đã khởi tạo ServerSocket bằng cách sử dụng hàm tạo không đối số.

Khi ServerSocket gọi accept (), phương thức sẽ không trả về cho đến khi máy khách kết nối. Sau khi máy khách kết nối, ServerSocket tạo một Socket mới trên một cổng không xác định và trả về một tham chiếu đến Socket mới này. Một kết nối TCP hiện đã tồn tại giữa máy khách và máy chủ và quá trình giao tiếp có thể bắt đầu.

Phương thức lớp Socket

Các java.net.Socketlớp đại diện cho socket mà cả máy khách và máy chủ sử dụng để giao tiếp với nhau. Máy khách nhận được một đối tượng Socket bằng cách khởi tạo một đối tượng, trong khi máy chủ nhận được một đối tượng Socket từ giá trị trả về của phương thức accept ().

Lớp Socket có năm hàm tạo mà máy khách sử dụng để kết nối với máy chủ -

Sr.No. Phương pháp & Mô tả
1

public Socket(String host, int port) throws UnknownHostException, IOException.

Phương pháp này cố gắng kết nối với máy chủ được chỉ định tại cổng được chỉ định. Nếu hàm tạo này không đưa ra một ngoại lệ, kết nối thành công và máy khách được kết nối với máy chủ.

2

public Socket(InetAddress host, int port) throws IOException

Phương thức này giống với phương thức khởi tạo trước đó, ngoại trừ máy chủ được ký hiệu bằng một đối tượng InetAddress.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

Kết nối với máy chủ và cổng được chỉ định, tạo một ổ cắm trên máy chủ cục bộ tại địa chỉ và cổng được chỉ định.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

Phương thức này giống với phương thức khởi tạo trước đó, ngoại trừ máy chủ được ký hiệu bằng đối tượng InetAddress thay vì chuỗi.

5

public Socket()

Tạo một ổ cắm không kết nối. Sử dụng phương thức connect () để kết nối ổ cắm này với máy chủ.

Khi phương thức khởi tạo Socket trả về, nó không chỉ khởi tạo một đối tượng Socket mà còn thực sự cố gắng kết nối với máy chủ và cổng được chỉ định.

Một số phương thức quan tâm trong lớp Socket được liệt kê ở đây. Lưu ý rằng cả máy khách và máy chủ đều có đối tượng Socket, vì vậy các phương thức này có thể được gọi bởi cả máy khách và máy chủ.

Sr.No. Phương pháp & Mô tả
1

public void connect(SocketAddress host, int timeout) throws IOException

Phương pháp này kết nối ổ cắm với máy chủ được chỉ định. Phương thức này chỉ cần thiết khi bạn khởi tạo Socket bằng cách sử dụng hàm tạo không đối số.

2

public InetAddress getInetAddress()

Phương thức này trả về địa chỉ của máy tính khác mà ổ cắm này được kết nối.

3

public int getPort()

Trả lại cổng mà ổ cắm được liên kết trên máy điều khiển từ xa.

4

public int getLocalPort()

Trả về cổng mà ổ cắm được liên kết trên máy cục bộ.

5

public SocketAddress getRemoteSocketAddress()

Trả về địa chỉ của ổ cắm từ xa.

6

public InputStream getInputStream() throws IOException

Trả về luồng đầu vào của ổ cắm. Luồng đầu vào được kết nối với luồng đầu ra của ổ cắm từ xa.

7

public OutputStream getOutputStream() throws IOException

Trả về luồng đầu ra của ổ cắm. Luồng đầu ra được kết nối với luồng đầu vào của ổ cắm từ xa.

số 8

public void close() throws IOException

Đóng socket, điều này làm cho đối tượng Socket này không còn khả năng kết nối lại với bất kỳ máy chủ nào.

Phương thức lớp InetAddress

Lớp này đại diện cho một địa chỉ Giao thức Internet (IP). Dưới đây là các phương pháp hữu ích sau đây mà bạn sẽ cần khi thực hiện lập trình socket -

Sr.No. Phương pháp & Mô tả
1

static InetAddress getByAddress(byte[] addr)

Trả về một đối tượng InetAddress được cung cấp địa chỉ IP thô.

2

static InetAddress getByAddress(String host, byte[] addr)

Tạo InetAddress dựa trên tên máy chủ và địa chỉ IP được cung cấp.

3

static InetAddress getByName(String host)

Xác định địa chỉ IP của máy chủ lưu trữ, với tên của máy chủ.

4

String getHostAddress()

Trả về chuỗi địa chỉ IP trong bản trình bày dạng văn bản.

5

String getHostName()

Lấy tên máy chủ cho địa chỉ IP này.

6

static InetAddress InetAddress getLocalHost()

Trả về máy chủ cục bộ.

7

String toString()

Chuyển đổi địa chỉ IP này thành một chuỗi.

Ví dụ về Socket Client

GreetingClient sau đây là một chương trình khách kết nối với máy chủ bằng cách sử dụng một ổ cắm và gửi lời chào, sau đó chờ phản hồi.

Thí dụ

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Ví dụ về Socket Server

Chương trình GreetingServer sau đây là một ví dụ về ứng dụng máy chủ sử dụng lớp Socket để lắng nghe máy khách trên số cổng được chỉ định bởi đối số dòng lệnh:

Thí dụ

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Biên dịch máy khách và máy chủ rồi khởi động máy chủ như sau:

$ java GreetingServer 6066
Waiting for client on port 6066...

Kiểm tra chương trình khách hàng như sau:

Đầu ra

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!