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.
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:
序号 | 方法描述 |
1 | public ServerSocket(int port) throws IOException 创建绑定到特定端口的服务器套接字。 |
2 | public ServerSocket(int port, int backlog) throws IOException 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 |
4 | public 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:
序号 | 方法描述 |
1 | public int getLocalPort() 返回此套接字在其上侦听的端口。 |
2 | public Socket accept() throws IOException 侦听并接受到此套接字的连接。 |
3 | public void setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。 |
4 | public 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.
序号 | 方法描述 |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
2 | public Socket(InetAddress host, int port) throws IOException 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程主机上的指定远程端口。 |
4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程地址上的指定远程端口。 |
5 | public 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.
序号 | 方法描述 |
1 | public void connect(SocketAddress host, int timeout) throws IOException 将此套接字连接到服务器,并指定一个超时值。 |
2 | public InetAddress getInetAddress() 返回套接字连接的地址。 |
3 | public int getPort() 返回此套接字连接到的远程端口。 |
4 | public int getLocalPort() 返回此套接字绑定到的本地端口。 |
5 | public SocketAddress getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 null。 |
6 | public InputStream getInputStream() throws IOException 返回此套接字的输入流。 |
7 | public OutputStream getOutputStream() throws IOException 返回此套接字的输出流。 |
8 | public void close() throws IOException 关闭此套接字。 |
Kaedah kelas InetAddress
Kelas ini mewakili alamat Internet Protocol (IP). Berikut ialah senarai kaedah yang lebih berguna untuk pengaturcaraan Socket:
序号 | 方法描述 |
1 | static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。 |
2 | static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。 |
3 | static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 |
4 | String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 |
5 | String getHostName() 获取此 IP 地址的主机名。 |
6 | static InetAddress getLocalHost() 返回本地主机。 |
7 | String 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!