Cấp bậc tác giả:

JAVA

Tutorial Socket Programming

Được viết bởi QuangIT ngày 20/09/2012 lúc 04:20 PM
Thuận ngữ network programming là thực hiện chương trình trên nhiều thiết bị(máy tính), trong đó các thiết bị được kết nối tất cả với nhau bằng cách sử dụng network.
  • 0
  • 10983

Tutorial Socket Programming

Thuận ngữ network programming là thực hiện chương trình trên nhiều thiết bị(máy tính), trong đó các thiết bị được kết nối tất cả với nhau bằng cách sử dụng network.

Các gói java.net của J2SE API chứa tập hợp các class và interface cung cấp chi tiết thông tin ở cấp thấp, cho phép bạn viết các chương trình tiêu điểm bằng cách giải quyết các vấn đề bằng tay.


Tên bài viết: Tutorial Socket Programming

Tác giả: Quang IT

Cấp độ bài viết: Chưa đánh giá

Tóm tắt:

Các gói java.net hỗ trợ 2 giao thức mạng phổ biến:

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 trên giao thức Internet, được gọi là TCP/IP.

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


Bài hướng dẫn này sẽ trình bày cho bạn hiểu về 2 đối tượng sau:


Lập trình Socket: được sử dụng nhiều nhất trong mạng và nó được giải thích rất chi tiết.

Xử lý URL


Socket Programming:

Sockets cung cấp cơ chế truyền thông giữa hai máy bằng cách sử dụng TCP. Chương trình Client tạo ra socket truyền thông đầu cuối và cố gắng để kết nối socket vào server.

Khi kết nối được thực hiện, máy chủ tạo ra một đối tượng socket đầu cuối. Các máy khách và máy chủ có thể giao tiếp bằng cách write và read từ socket.

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


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

1. Máy chủ tạo đối tượng ServerSocket, biểu thị số cổng giao tiếp.

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

3. Sau khi máy chủ chờ, client tạo đối tượng Socket, quy định cụ thể tên máy chủ và số cổng để kết nối.

4. Cấu trúc của lớp Socket cố gắng để kết nối máy khách đến máy chủ được chỉ định và số cổng. Nếu thông tin liên lạc đượ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ủ.

5. Về phía máy chủ, phương thức accept() trả về một tham chiếu đến socket mới trên máy chủ được kết nối với socket của máy khách.


Sau khi kết nối được thiết lập, truyền thông có thể xảy ra bằng cách sử dụng luồng I/O. Mỗi socket 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ác máy khách được kết nối với OutputStream của máy chủ.


TCP là giao thức lưu thông 2 chiều thông tin liên lạc, vì vậy dữ liệu có thể được gửi qua cả hai dòng cùng một lúc. Có các lớp hữu ích sau đây cung cấp đầy đủ các phương thức để thực hiện socket.


Các phương thức của Lớp ServerSocket:

Lớp java.net.ServerSocket được sử dụng bởi các ứng dụng máy chủ để có được cổng và lắng nghe cho các yêu cầu của phía máy khách


Lớp ServerSocket có bốn constructor:

1. public ServerSocket(int port) throws IOException

Tạo ra socket trên máy chủ bị ràng buộc vào cổng. Một ngoại lệ xảy ra nếu cổng đã được 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ư constructor trước đó, các tham số tồn đọng quy định cụ thể như thế nào để máy khách lưu trữ trong một hàng đợi.

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

Tương tự như constructor trước đó, các tham số InetAddress quy định cụ thể địa chỉ IP để 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 các máy chủ xác định địa chỉ IP của mình để chấp nhận các yêu cầu phía máy khách

4. public ServerSocket() throws IOException

Tạo socket máy chủ không bị ràng buộc. Khi sử dụng constructor 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 đã thành công bị ràng buộc vào cổng quy định và đã sẵn sàng cho các yêu cầu của máy khách.


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

1. public int getLocalPort ()

Trả về cổng socket máy chủ là lắng nghe trên. Phương thức này rất hữu ích nếu bạn thông qua trong 0 là số cổng trong constructor và để cho các máy chủ tìm thấy một cổng cho bạn.

2. public Socket accept() throws IOException

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

3. public void setSoTimeout(int timeout)

Thiết lập giá trị thời gian bao lâu socket máy chủ chờ đợi máy khách trong quá trình accept().

4. public void bind(SocketAddress host, int backlog)

Liên kết với socket máy chủ được chỉ định và cổng 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 constructor không có đối số.


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


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

Lớp java.net.Socket đại diện cho socket cả hai máy khách và máy chủ sử dụng để giao tiếp với nhau. Máy Khách có được đối tượng Socket bởi instantiating one, 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 constructor mà máy khách sử dụng để kết nối với máy chủ:

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

Phương thức này cố gắng để kết nối với máy chủ được chỉ định tại cổng quy định. Nếu constructor 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ủ.

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

Phương thức này giống hệt constructor trước đó, ngoại trừ host được biểu hiện 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 host và cổng quy định, tạo ra socket trên máy chủ lưu trữ local tại địa chỉ quy định và cổng.

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

Phương thức này giống hệt constructor trước đó, ngoại trừ host được ký hiệu là một đối tượng InetAddress thay vì một String

5. public Socket()

Tạo socket chưa được nối. Sử dụng phương thức connect() để kết nối socket đến máy chủ.


Khi constructor Socket trả về, nó không chỉ đơn giản là tạo một đối tượng socket nhưng nó cố gắng để kết nối với host và cổng quy định.


Một số phương thức liên quan đến lớp Socket được liệt kê ở đây. Chú ý rằng cả hai máy khách và máy chủ có một đối tượng Socket, do đó, các phương thức này có thể được viện dẫn bởi cả hai máy khách và máy chủ.


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

Phương thức này kết nối các socket cho các máy chủ xác định. Phương thức này là cần thiết chỉ khi bạn khởi tạo Socket bằng cách sử dụng các constructor không có đối số.

2. public InetAddress getInetAddress()

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

3. public int getPort()

Trả về cổng socket là bị ràng buộc trên máy từ xa.

4. public int getLocalPort()

Trả về cổng socket là bị ràng buộc trên máy local.

5. public SocketAddress getRemoteSocketAddress()

Trả về địa chỉ của các socket từ xa.

6. public InputStream getInputStream() throws IOException

Trả về dòng đầu vào socket. Các dòng đầu vào được kết nối với các dòng sản lượng của các socket từ xa.

7. public OutputStream getOutputStream() throws IOException

Trả về dòng sản lượng của socket. Các dòng sản lượng được kết nối với các dòng đầu vào của các socket từ xa

8. public void close() throws IOException

Đóng Socket, mà làm cho đối tượng Socket này không còn có khả năng kết nối một lần nữa đến bất kỳ máy chủ


Phương thức Lớp InetAddress:


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

1. static InetAddress getByAddress(byte[] addr)

Trả về đối tượng InetAddress object dựa vào địa chỉ IP.

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

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

3. static InetAddress getByName(String host)

Xác định địa chỉ IP của host, tên của host.

4. String getHostAddress()

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

5. String getHostName()

Lấy tên host cho địa chỉ IP này

6. static InetAddress InetAddress getLocalHost()

Trả về localhost.

7. String toString()

Chuyển đối địa chỉ IP này thành chuỗi


Ví dụ Socket Client:

GreetingClient sau đây là một chương trình máy khách kết nối đến một máy chủ bằng cách sử dụng socket và gửi một lời chào, và sau đó chờ đợi phản ứng từ phía server.

// 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ụ Socket Server:

Chương trình GreetingServer sau đây là một ví dụ của một ứng dụng máy chủ có 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:

// 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ủ. Chạy máy chủ:

Waiting for client on port 8000...

Just connected to /127.0.0.1:6938

Hello from /127.0.0.1:6938

Waiting for client on port 8000...

Socket timed out!

Chạy máy client:

Connecting to localhost on port 8000

Just connected to localhost/127.0.0.1:8000

Server says Thank you for connecting to /127.0.0.1:8000

Goodbye!

Nguồn bài viết: Dngaz.com

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML