一、TCP協議簡介
TCP(傳輸控制協議)是一種可靠的、基於連接的協議,它在傳輸數據時能夠保證數據的可靠性和有序性。在TCP協議中,通信兩端通過三次握手建立連接,傳輸數據時可靠地分段傳輸,並通過確認、重傳等機制保證數據的可靠性和有序性。
相對於UDP協議,TCP協議的優點是可靠,缺點是效率較低。因此在需要傳輸可靠性高的數據時,一般使用TCP協議。
二、Java TCP通信的實現
Java提供了Socket和ServerSocket兩個類來實現TCP通信。其中Socket類用於與遠程主機建立連接,而ServerSocket類用於監聽端口,並等待客戶端連接。
三、TCP客戶端的實現
以下是一個TCP客戶端的基本實現代碼:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws IOException {
String hostName = "localhost"; // 服務端主機名或IP地址
int port = 1234; // 服務端監聽端口
try (
Socket socket = new Socket(hostName, port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
) {
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服務器回復:" + in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("無法連接到主機:" + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("無法獲取I/O連接:" + hostName);
System.exit(1);
}
}
}
客戶端通過創建一個Socket連接到服務端,並通過輸入輸出流傳輸數據。其中,Socket的構造函數參數為服務端的主機名和監聽端口。使用PrintWriter向服務端輸出數據,並使用BufferedReader從服務端接收響應數據。
四、TCP服務端的實現
以下是一個TCP服務端的基本實現代碼:
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String[] args) throws IOException {
int port = 1234; // 監聽端口
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服務器正在監聽端口:" + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客戶端連接成功,客戶端IP地址:" + socket.getInetAddress());
new ClientThread(socket).start();
}
} catch (IOException e) {
System.err.println("無法監聽端口:" + port);
System.exit(1);
}
}
}
class ClientThread extends Thread {
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
public void run() {
try (
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("客戶端:" + socket.getInetAddress() + "輸入:" + inputLine);
out.println("服務端回復:" + inputLine);
}
System.out.println("客戶端斷開連接");
} catch (IOException e) {
e.printStackTrace();
}
}
}
服務端通過使用ServerSocket監聽指定端口,並等待客戶端連接。一旦客戶端連接成功,服務端會創建一個ClientThread線程來處理客戶端的請求。ClientThread中,使用輸入輸出流與客戶端進行通信。其中, PrintWriter對象用於向客戶端輸出數據,BufferedReader對象用於從客戶端接收數據。
五、小結
通過Java的Socket和ServerSocket類,我們可以很方便地實現TCP通信。在實現TCP通信時,需要注意建立連接的順序,以及數據傳輸的可靠性。同時,我們還可以使用多線程來處理多個客戶端的請求,從而實現一個支持多客戶端的TCP服務器。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198684.html
微信掃一掃
支付寶掃一掃