Thứ Hai, 13 tháng 8, 2018

Java - Mạng

ảnh minh họa

Học lập trình java : Thuật ngữ mạng thuật ngữ dùng để chỉ các chương trình viết 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ạng.

Gói java.net của các API J2SE chứa một tập hợp các lớp và các giao diện cung cấp các chi tiết giao tiếp mức 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 chung

TCP - TCP là viết tắt của Transmission Control Protocol, cho phép truyền thô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 Giao thức người dùng datagram, một giao thức ít 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 cho một sự hiểu biết tốt về hai chủ đề sau đây

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.

Xử lý URL - Đ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

Ổ cắm cung cấp cơ chế truyền thông giữa hai máy tính sử dụng TCP. Một chương trình máy khách tạo ra một socket trên phần cuối của giao tiếp và cố gắng kết nối socket đó với 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. Khách hàng và máy chủ hiện có thể giao tiếp bằng cách viết và đọc từ ổ cắm.

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ế cho chương trình máy chủ để lắng nghe các máy khách và thiết lập các 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 bằng cách sử dụng ổ cắm

Máy chủ khởi tạo một đố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 thức 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 đã cho.

Sau khi máy chủ đang chờ, máy khách sẽ 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.

Phương thức khởi tạo của lớp Socket cố 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 hiện 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 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 các kết nối được thiết lập, thông tin liên lạc có thể xảy ra khi sử dụng luồng I / O. Mỗi socket có cả OutputStream và InputStream. OutputStream của máy khách được kết nối với InputStream của máy chủ và InputStream của máy khách được kết nối với OutputStream của máy chủ.

TCP là 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 các phương thức hoàn chỉnh để thực hiện các ổ cắm.

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

Lớp java.net.ServerSocket đượ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 thức & Mô tả
1công khai ServerSocket (int port) ném IOException

Nỗ lực để tạo ra một ổ cắm máy chủ bị ràng buộc vào 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.
2public ServerSocket (int cổng, int backlog) ném IOException

Tương tự như hàm tạo trước đó, tham số backlog chỉ định số lượng khách hàng đến để lưu trữ trong hàng chờ đợi.
3công khai ServerSocket (int cổng, int backlog, địa chỉ InetAddress) ném IOException

Tương tự như hàm tạo trước đó, tham số InetAddress chỉ định địa chỉ IP cục bộ để liên kết đến. 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ủ xác đị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.
4public ServerSocket () ném 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, sử dụng phương thức bind () khi bạn đã sẵn sàng ràng buộc socket máy chủ.
Nếu constructor ServerSocket không ném một ngoại lệ, nó 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 máy khách.

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

Sr.No.Phương thức & Mô tả
1public int getLocalPort ()

Trả về cổng mà ổ cắm máy chủ đang lắng nghe. Phương thức này rất hữu ích nếu bạn truyền vào 0 làm số cổng trong một hàm tạo và để cho máy chủ tìm thấy một cổng cho bạn.
2public Socket accept () ném IOException

Chờ đợi cho 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 đã chỉ định hoặc thời gian ổ cắm ra, giả định rằng giá trị hết thời gian đã được thiết lập bằng phương thức setSoTimeout (). Nếu không, phương pháp này sẽ chặn vô thời hạn.
3public void setSoTimeout (hết thời gian chờ)

Đặt giá trị hết thời gian cho thời gian máy chủ chờ đợi cho máy khách trong quá trình accept ().
4công khai void bind (SocketAddress máy chủ, int tồn đọng)

Liên kết ổ cắm với máy chủ và cổng được chỉ định trong đối tượng SocketAddress. Sử dụng phương thức này nếu bạn đã khởi tạo ServerSocket bằng cách sử dụng hàm tạo không có đối số.
Khi ServerSocket gọi phương thức accept (), phương thức này không trả về cho đến khi một máy khách kết nối. Sau khi client 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.

Kết nối TCP hiện tồn tại giữa máy khách và máy chủ, và việc truyền thông có thể bắt đầu.

Phương pháp Class Socket

Lớp java.net.Socket đại diện cho socket mà cả client và server 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 Socket, 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 ().

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 thức & Mô tả
1Socket công cộng (String host, int port) ném 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 ném 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ủ.
2công cộng Socket (InetAddress máy chủ, int cổng) ném IOException

Phương thức này giống hệt với hàm tạo trước đó, ngoại trừ máy chủ được ký hiệu bởi một đối tượng InetAddress.
3Socket công cộng (String host, int port, InetAddress localAddress, int localPort) ném 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ổ cắm công cộng (máy chủ InetAddress, cổng int, InetAddress localAddress, int localPort) ném IOException.

Phương thức này giống hệt với hàm tạo trước đó, ngoại trừ máy chủ được ký hiệu bởi một đối tượng InetAddress thay vì một String.
5ổ cắm công cộng ()

Tạo một ổ cắm chưa được kết nối. Sử dụng phương thức connect () để kết nối socket này với máy chủ.
Khi hàm tạo Socket trả về, nó không đơn giản khởi tạo một đối tượng Socket nhưng 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ó một đố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 lẫn máy chủ.

Sr.No.Phương thức & Mô tả
1công cộng void kết nối (SocketAddress máy chủ, int thời gian chờ) ném IOException

Phương pháp này kết nối socket 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 có đối số.
2công khai 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 kết nối tới.
3public int getPort ()

Trả về cổng mà ổ cắm được gắn vào máy từ xa.
4public int getLocalPort ()

Trả về cổng mà socket được gắn với máy cục bộ.
5công khai SocketAddress getRemoteSocketAddress ()

Trả về địa chỉ của ổ cắm từ xa.
6công khai InputStream getInputStream () ném IOException

Trả về luồng đầu vào của socket. Luồng đầu vào được kết nối với luồng đầu ra của ổ cắm từ xa.
7public OutputStream getOutputStream () ném IOException

Trả về luồng đầu ra của socket. Luồng đầu ra được kết nối với luồng đầu vào của ổ cắm từ xa.
số 8public void close () ném IOException

Đóng socket, 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.

Các phương thức của 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 thức hữu ích mà bạn cần trong khi lập trình socket

Sr.No.Phương thức & Mô tả
1static InetAddress getByAddress (byte [] addr)

Trả về đối tượng InetAddress cho địa chỉ IP thô.
2static InetAddress getByAddress (Máy chủ chuỗi, byte [] addr)

Tạo một InetAddress dựa trên tên máy chủ và địa chỉ IP được cung cấp.
3static InetAddress getByName (Máy chủ chuỗi)

Xác định địa chỉ IP của một máy chủ, được đặt tên của máy chủ.
4Chuỗi getHostAddress ()

Trả về chuỗi địa chỉ IP trong bản trình bày văn bản.
5Chuỗi getHostName ()

Nhận tên máy chủ cho địa chỉ IP này.
6static InetAddress InetAddress getLocalHost ()

Trả về máy chủ cục bộ.
7Chuỗi toString ()

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

Ví dụ về Socket Client

GreetingClient sau đây là một chương trình máy khách kết nối với một máy chủ bằng cách sử dụng một socket và gửi một lời chào, và 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ề một ứng dụng máy chủ có sử dụng lớp Socket để lắng nghe các máy khách trên một số cổng được chỉ định bởi một đố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ủ, sau đó 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!

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...