pengaturcaraan rangkaian Java


Pengaturcaraan rangkaian merujuk kepada penulisan atur cara yang dijalankan pada berbilang peranti (komputer) yang semuanya disambungkan melalui rangkaian.

API J2SE dalam pakej java.net mengandungi kelas dan antara muka yang menyediakan butiran komunikasi peringkat rendah. Anda boleh menggunakan kelas dan antara muka ini secara langsung untuk menumpukan pada penyelesaian masalah dan bukannya pada butiran komunikasi.

Pakej java.net menyediakan sokongan untuk dua protokol rangkaian biasa:

  • TCP: TCP ialah singkatan daripada Transmission Control Protocol, Ia menjamin komunikasi yang boleh dipercayai antara dua aplikasi. Biasa digunakan untuk protokol Internet, dikenali sebagai TCP/IP.

  • UDP: UDP ialah singkatan Protokol Datagram Pengguna, protokol tanpa sambungan. Menyediakan paket data untuk dihantar antara aplikasi.

Tutorial ini menerangkan terutamanya dua topik berikut.

  • Soket Pengaturcaraan : Ini adalah konsep rangkaian yang paling banyak digunakan dan ia telah dijelaskan dengan terperinci

  • URL Pemprosesan: Bahagian ini akan dibincangkan dalam ruang lain Klik di sini untuk mengetahui lebih lanjut tentang pemprosesan URL dalam bahasa Java.


Pengaturcaraan Soket

Soket menyediakan mekanisme komunikasi antara dua komputer menggunakan TCP. Program klien mencipta soket dan cuba menyambung ke soket pelayan.

Apabila sambungan diwujudkan, pelayan akan mencipta objek Soket. Pelanggan dan pelayan kini boleh berkomunikasi dengan menulis dan membaca dari objek Socket.

Kelas java.net.Socket mewakili soket, dan kelas java.net.ServerSocket menyediakan mekanisme untuk program pelayan mendengar pelanggan dan mewujudkan hubungan dengan mereka.

Langkah berikut berlaku apabila mewujudkan sambungan TCP antara dua komputer menggunakan soket:

  • Pelayan membuat instantiate objek ServerSocket, yang mewakili komunikasi melalui port pada pelayan.

  • Pelayan memanggil kaedah accept() kelas ServerSocket, yang menunggu sehingga klien menyambung ke port yang diberikan pada pelayan.

  • Semasa pelayan menunggu, pelanggan membuat instantiate objek Socket, menyatakan nama pelayan dan nombor port untuk meminta sambungan.

  • Pembina kelas Socket cuba menyambungkan klien ke pelayan dan nombor port yang ditentukan. Jika komunikasi diwujudkan, objek Soket dicipta pada klien untuk berkomunikasi dengan pelayan.

  • Di bahagian pelayan, kaedah accept() mengembalikan rujukan soket baharu pada pelayan yang disambungkan ke soket klien.


Selepas sambungan diwujudkan, komunikasi dijalankan menggunakan aliran I/O. Setiap soket mempunyai aliran keluaran dan aliran masukan. Aliran keluaran klien disambungkan ke aliran input pelayan, dan aliran input klien disambungkan ke aliran keluaran pelayan.


TCP ialah protokol komunikasi dua hala, jadi data boleh dihantar melalui dua aliran data pada masa yang sama Berikut ialah set lengkap kaedah berguna yang disediakan oleh beberapa kelas untuk dilaksanakan soket.


Kaedah kelas ServerSocket

Aplikasi pelayan menggunakan kelas java.net.ServerSocket untuk mendapatkan port dan mendengar permintaan pelanggan.

Kelas ServerSocket mempunyai empat pembina:

序号方法描述
1public ServerSocket(int port) throws IOException
创建绑定到特定端口的服务器套接字。
2public ServerSocket(int port, int backlog) throws IOException
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
4public ServerSocket() throws IOException
创建非绑定服务器套接字。

Buat soket pelayan tidak terikat. Jika kaedah pembinaan ServerSocket tidak memberikan pengecualian, ini bermakna aplikasi anda telah berjaya terikat pada port yang ditentukan dan sedang mendengar permintaan pelanggan.

Berikut ialah beberapa kaedah biasa kelas ServerSocket:

序号方法描述
1public int getLocalPort()
  返回此套接字在其上侦听的端口。
2public Socket accept() throws IOException
侦听并接受到此套接字的连接。
3public void setSoTimeout(int timeout)
 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。
4public void bind(SocketAddress host, int backlog)
将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

Kaedah kelas Socket

Kelas java.net.Socket mewakili soket yang digunakan oleh kedua-dua pelanggan dan pelayan untuk berkomunikasi antara satu sama lain. Pelanggan memperoleh objek Socket melalui instantiasi, dan pelayan memperoleh objek Socket melalui nilai pulangan kaedah accept().

Kelas Socket mempunyai lima kaedah pembinaan.

序号方法描述
1public Socket(String host, int port) throws UnknownHostException, IOException.
创建一个流套接字并将其连接到指定主机上的指定端口号。
2public Socket(InetAddress host, int port) throws IOException
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
创建一个套接字并将其连接到指定远程主机上的指定远程端口。
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
创建一个套接字并将其连接到指定远程地址上的指定远程端口。
5public Socket()
通过系统默认类型的 SocketImpl 创建未连接套接字

Apabila pembina Socket kembali, ia tidak hanya membuat seketika objek Socket, ia sebenarnya akan cuba menyambung ke pelayan dan port yang ditentukan.

Beberapa kaedah menarik disenaraikan di bawah. Harap maklum bahawa kedua-dua pelanggan dan pelayan mempunyai objek Socket, jadi kedua-dua pelanggan dan pelayan boleh memanggil kaedah ini.

序号方法描述
1public void connect(SocketAddress host, int timeout) throws IOException
将此套接字连接到服务器,并指定一个超时值。
2public InetAddress getInetAddress()
 返回套接字连接的地址。
3public int getPort()
返回此套接字连接到的远程端口。
4public int getLocalPort()
返回此套接字绑定到的本地端口。
5public SocketAddress getRemoteSocketAddress()
返回此套接字连接的端点的地址,如果未连接则返回 null。
6public InputStream getInputStream() throws IOException
返回此套接字的输入流。
7public OutputStream getOutputStream() throws IOException
返回此套接字的输出流。
8public void close() throws IOException
关闭此套接字。

Kaedah kelas InetAddress

Kelas ini mewakili alamat Internet Protocol (IP). Berikut ialah senarai kaedah yang lebih berguna untuk pengaturcaraan Socket:

序号方法描述
1static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
2static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddress。
3static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
4String getHostAddress() 
返回 IP 地址字符串(以文本表现形式)。
5String getHostName() 
 获取此 IP 地址的主机名。
6static InetAddress getLocalHost()
返回本地主机。
7String toString()
将此 IP 地址转换为 String。

Instance klien soket

GreetingClient berikut ialah program klien yang menyambung ke pelayan melalui soket dan menghantar permintaan, kemudian menunggu jawapan.

// 文件名 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();
      }
   }
}

Instance pelayan soket

Program GreetingServer berikut ialah aplikasi sebelah pelayan yang menggunakan Socket untuk mendengar port yang ditentukan.

// 文件名 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();
      }
   }
}

Kompilkan kod java di atas, dan laksanakan arahan berikut untuk memulakan perkhidmatan, menggunakan nombor port 6066:

$ java GreetingServer 6066
Waiting for client on port 6066...
Mulakan klien seperti berikut:
$ 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!