Networks Business Online Việt Nam & International VH2

Lập trình mạng Socket – Lập trình mạng Socket trong Java

Đăng ngày 06 November, 2022 bởi admin

Lập trình mạng Socket – Lập trình mạng Socket trong Java

Khái niệm lập trình mạng (network programming) nói về viết các chương trình mà thực thi qua nhiều thiết bị (máy tính), trong đó các thiết bị này được kết nối mạng với nhau.

Để hiểu sâu hơn các khái niệm được trình bày trong chương này, mời bạn tham khảo loạt bài: Ví dụ về Lập trình mạng Socket – Lập trình mạng Socket trong Java.

Gói java.net của J2SE API chứa một tập hợp những class và interface mà cung ứng cụ thể về tiếp xúc tầm thấp, được cho phép bạn viết những chương trình mà trọng tâm vào xử lý yếu tố trong tầm tay .
Gói java.net cung ứng sự tương hỗ cho hai giao thức mạng phổ cập :

  • TCP: TCP là viết tắt của Transmission Control Protocol, cho phép sự giao tiếp đáng tin cậy giữa hai ứng dụng. TCP đặc trưng được sử dụng qua Internet Protocol, được xem như là TCP/IP.

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

Chương này giúp bạn hiểu sâu về hai chủ đề trong Java :

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

  • Tiến trình URL: Nó sẽ được trình bày riêng. Bạn click vào link sau để học về Tiến trình xử lý URL trong Java.

Lập trình Socket trong Java

Các Socket phân phối kỹ thuật tiếp xúc giữa hai máy tính sử dụng TCP. Một chương trình Client tạo một socket trên đầu cuối của tiếp xúc và cố gắng nỗ lực để liên kết socket đó tới một Server .
Khi liên kết được tạo, Server tạo một đối tượng người dùng Socket trên đầu cuối của tiếp xúc. Client và Server giờ đây hoàn toàn có thể tiếp xúc bằng việc đọc và ghi từ Socket .
Lớp java.net. Socket trình diễn một Socket, và lớp java.net. ServerSocket cung ứng một kỹ thuật cho chương trình Server để nghe thông tin từ những Client và xây dựng những liên kết với chúng .
Các bước sau xảy ra khi xây dựng một liên kết TCP giữa hai máy tính sử dụng Socket :

  • Server khởi tạo một đối tượng người tiêu dùng ServerSocket, biểu lộ số hiệu cổng ( port ) nào để Open tiếp xúc .
  • Server gọi phương pháp accept ( ) của lớp ServerSocket. Phương thức này đợi tới khi một Client liên kết với Server trên cổng đã cho .
  • Sau khi Server đang đợi, một Client khởi tạo một đối tượng người tiêu dùng Socket, xác lập tên Server và số hiệu cổng để liên kết tới .
  • Constructor của lớp Socket nỗ lực để liên kết Client tới Server và số hiệu cổng đã xác lập. Nếu tiếp xúc được xây dựng, giờ đây Client có một đối tượng người tiêu dùng Socket có năng lực tiếp xúc với Server .
  • Trên Server-side, phương pháp accept ( ) trả về một tham chiếu tới một socket mới trên Server mà được liên kết với socket của Client .

Quảng cáo

Sau khi những liên kết được xây dựng, tiếp xúc hoàn toàn có thể xảy ra bởi sử dụng I / O stream. Mỗi Socket có cả một OutputStream và InputStream. OutputStream của Client được liên kết với InputStream của Server, và InputStream của Client được liên kết với OutputStream của Server .
TCP là một giao thức tiếp xúc hai chiều, vì vậy tài liệu hoàn toàn có thể được gửi qua cả hai luồng tại cùng một thời gian. Các lớp hữu dụng sau đây cung ứng khá đầy đủ những phương pháp để tiến hành những Socket .

Các phương thức lớp ServerSocket trong Java

Lớp java.net.ServerSocket trong Java được sử dụng bởi các ứng dụng Server để thu nhận một cổng và nghe các yêu cầu từ Client.

Lớp ServerSocket có 4 constructor sau :

STT Phương thức và miêu tả
1 public ServerSocket(int port) throws IOException
Cố gắng để tạo một Server Socket số lượng giới hạn với số hiệu cổng đã xác lập. Một exception Open nếu cổng này thuộc khoanh vùng phạm vi của ứng dụng khác .
2 public ServerSocket(int port, int backlog) throws IOException
Tương tự như constructor trước, tham số backlog xác lập có bao nhiêu Client đang vào để lưu giữ trong một hàng đợi ( wait queue )
3 public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Tương tự như constructor trước, tham số InetAddress xác lập địa chỉ IP nội bộ để liên kết tới. InetAddress này được sử dụng cho những Server mà hoàn toàn có thể có nhiều địa chỉ IP, được cho phép Server xác lập địa chỉ IP nào của nó để đồng ý nhu yếu của Client
4 public ServerSocket() throws IOException
Tạo một Server Socket không số lượng giới hạn. Khi sử dụng constructor này, sử dụng phương pháp bind ( ) khi bạn đã liên kết với Server Socket

Nếu ServerSocket constructor không ném một exception, nghĩa là ứng dụng của bạn đã thành công xuất sắc liên kết tới cổng đã xác lập và chuẩn bị sẵn sàng cho những nhu yếu của Client .
Bảng dưới liệt kê những phương pháp thông dụng của lớp ServerSocket trong Java :

STT Phương thức và miêu tả
1 public int getLocalPort()
Trả về cổng mà Server Socket đang nghe trên đó. Phương thức này hữu dụng nếu bạn truyền số hiệu cổng là 0 trong một constructor và để Server tìm một cổng cho bạn
2 public Socket accept() throws IOException
Đợi cho một Client đang đến. Phương thức này block tới khi một Client liên kết tới Server trên cổng đã xác lập hoặc Socket là trễ ( timeout ), giả sử rằng giá trị time-out đã được thiết lập với phương pháp setSoTimeout ( ). Nếu không thì, phương pháp này block vô hạn
3 public void setSoTimeout(int timeout)
Thiết lập giá trị timeout cho Server Socket đợi một Client trong bao lâu, trong khi phương pháp accept ( ) gọi
4 public void bind(SocketAddress host, int backlog)
Nối kết Socket tới Server và cổng đã xác lập trong đối tượng người tiêu dùng SocketAddress. Sử dụng phương pháp này nếu bạn đã khởi tạo đối tượng người tiêu dùng ServerSocket với constructor không có tham số

Khi ServerSocket gọi phương thức accept(), phương thức này không trả về giá trị tới khi một Client kết nối. Sau khi một Client kết nối, ServerSocket tạo một Socket mới trên một cổng chưa được xác định và trả về một tham chiếu tới Socket mới này. Bây giờ, một kết nối TCP tồn tại giữa Client và Server, và giao tiếp có thể bắt đầu.

Quảng cáo

Các phương thức lớp Socket trong Java

Lớp java.net.Socket biểu diễn socket mà cả Client và Server sử dụng để kết nối với nhau. Client thu nhận một đối tượng Socket bằng việc khởi tạo nó, trong khi Server thu nhận một đối tượng Socket từ giá trị trả về của phương thức accept().

Lớp Socket có 5 constructor mà một Client sử dụng để liên kết tới một Server :

STT Phương thức và Miêu tả
1 public Socket(String host, int port) throws UnknownHostException, IOException.
Phương thức này cố gắng nỗ lực liên kết tới Server đã xác lập tại cổng đã xác lập. Nếu constructor này không ném một exception, liên kết là thành công xuất sắc và Client được liên kết tới Server
2 public Socket(InetAddress host, int port) throws IOException
Phương thức này tựa như constructor trước, ngoại trừ host được bộc lộ bởi một đối tượng người tiêu dùng InetAddress
3 public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Kết nối tới host và cổng đã xác lập, tạo một Socket trên host nội bộ tại địa chỉ và cổng đã xác lập
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Phương thức này tương tự như constructor trước, ngoại trừ host được bộc lộ bởi một đối tượng người dùng InetAddress thay vì một String
5 public Socket()
Tạo một Socket rời rạc. Sử dụng phương pháp connect ( ) để liên kết Socket này tới một Server

Khi Socket constructor trả về giá trị, nó không đơn thuần chỉ khởi tạo một đối tượng người tiêu dùng Socket mà nó còn thực sự cố gắng nỗ lực liên kết tới Server và cổng đã xác lập .
Một số phương pháp của lớp Socket đáng chăm sóc được liệt kê dưới đây. Chú ý rằng, cả Server và Client đều có một đối tượng người dùng Socket, do đó những phương pháp này hoàn toàn có thể được gọi bởi cả Client và Server .

STT Phương thức và Miêu tả
1 public void connect(SocketAddress host, int timeout) throws IOException
Phương thức này liên kết Socket tới host đã xác lập. Phương thức này chỉ thiết yếu khi bạn đã khởi tạo Socket bởi sử dụng constructor không có tham số
2 public InetAddress getInetAddress()
Phương thức này trả về địa chỉ của máy tính khác mà Socket này được liên kết tới
3 public int getPort()
Trả về cổng mà Socket được liên kết trên thiết bị từ xa
4 public int getLocalPort()
Trả về cổng mà Socket được liên kết trên thiết bị nội bộ
5 public SocketAddress getRemoteSocketAddress()
Trả về địa chỉ của Socket từ xa
6 public InputStream getInputStream() throws IOException
Trả về input stream của Socket. Input stream được liên kết tới output stream của Socket từ xa
7 public OutputStream getOutputStream() throws IOException
Trả về output stream của Socket. Output stream được liên kết tới input stream của Socket từ xa
8 public void close() throws IOException
Đóng Socket, mà làm đối tượng người tiêu dùng Socket này không còn năng lực liên kết lại với bất kỳ Server nào

Các phương thức lớp InetAddress trong Java

Lớp này trình diễn một địa chỉ Internet Protocol ( IP ). Dưới đây liệt kê 1 số ít phương pháp hữu dụng mà bạn sẽ cần trong khi lập trình Socket .

STT Phương thức và Miêu tả
1 static InetAddress getByAddress(byte[] addr)
Trả về một đối tượng người tiêu dùng InetAddress đã cung ứng địa chỉ IP thô
2 static InetAddress getByAddress(String host, byte[] addr)
Tạo một InetAddress dựa trên tên host và địa chỉ IP đã phân phối
3 static InetAddress getByName(String host)
Xác định địa chỉ IP của một host, đã phân phối tên host
4 String getHostAddress()
Trả về chuỗi địa chỉ IP dạng màn biểu diễn nguyên văn
5 String getHostName()
Nhận tên host cho địa chỉ IP này
6 static InetAddress InetAddress getLocalHost()
Trả về host nội bộ
7 String toString()
Biến đổi địa chỉ IP này thành một String

Ví dụ về Socket Client trong Java

GreetingClient sau là một chương trình Client liên kết tới một Server bởi sử dụng một Socket và gửi một lời chào, và sau đó đợi một phản hồi .

// File Name GreetingClient.java

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

public class GreetingClient
{
   public static void main(String [] args)
   {
      String tenServer = args[0];
      int port = Integer.parseInt(args[1]);
      try
      {
         System.out.println("Ket noi toi " + tenServer
                             + " on port " + port);
         Socket client = new Socket(tenServer, 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 trong Java

Chương trình GreetingServer sau là ví dụ về một ứng dụng Server sử dụng lớp Socket để lắng nghe những Client trên một số hiệu cổng đã xác lập bởi một tham số dòng lệnh .

// 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 Client và Server và sau đó mở màn Server như sau :

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

Kiểm tra chương trình Client như sau :

$ 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!

Đã có app VietJack trên điện thoại thông minh, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi trực tuyến, Bài giảng …. không tính tiền. Tải ngay ứng dụng trên Android và iOS .

Theo dõi chúng tôi không tính tiền trên mạng xã hội facebook và youtube :

Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập Java. Khóa học có giá chỉ 300K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chương và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu yếu mua, inbox trực tiếp a Tuyền, cựu sinh viên Bách Khoa K53, fb : https://www.facebook.com/tuyen.vietjack
Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của : Tutorialspoint. com
Follow facebook cá thể Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để liên tục theo dõi những loạt bài mới nhất về Java, C, C + +, Javascript, HTML, Python, Database, Mobile …. mới nhất của chúng tôi .

Source: https://vh2.com.vn
Category : Tin Học