MST
星途 面试题库

面试题:Java中TCP和UDP在数据传输可靠性方面的区别及实现方式

请阐述在Java编程中,TCP和UDP在数据传输可靠性上有何不同,并举例说明如何使用Java代码实现可靠的TCP传输和不可靠的UDP传输。
19.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

TCP和UDP在数据传输可靠性上的不同

  • TCP(传输控制协议):是面向连接的、可靠的传输协议。它通过三次握手建立连接,保证数据有序且无差错地到达。如果数据在传输过程中丢失或损坏,TCP会自动重传。它还会对数据进行流量控制和拥塞控制,确保发送方不会以过快的速度发送数据,避免网络拥塞。
  • UDP(用户数据报协议):是无连接的、不可靠的传输协议。UDP发送数据时不需要建立连接,直接将数据报发送出去,不保证数据一定能到达目的地,也不保证数据的顺序和完整性。但是UDP的优点是传输速度快,因为它没有TCP那样复杂的控制机制,适合对实时性要求高但对数据准确性要求相对较低的场景,如视频流、音频流传输。

可靠的TCP传输Java代码示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端
public class TCPServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket serverSocket = new ServerSocket(12345)) {
            System.out.println("Server started, waiting for a connection...");
            try (Socket clientSocket = serverSocket.accept();
                 PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    System.out.println("Received: " + inputLine);
                    out.println("Echo: " + inputLine);
                }
            }
        }
    }
}

// 客户端
public class TCPClient {
    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 12345);
             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("Server response: " + in.readLine());
            }
        }
    }
}

不可靠的UDP传输Java代码示例

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

// UDP服务端
public class UDPServer {
    public static void main(String[] args) throws IOException {
        try (DatagramSocket socket = new DatagramSocket(12345)) {
            byte[] receiveBuffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
            socket.receive(receivePacket);
            String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received: " + message);

            byte[] sendBuffer = ("Echo: " + message).getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, receivePacket.getAddress(), receivePacket.getPort());
            socket.send(sendPacket);
        }
    }
}

// UDP客户端
public class UDPClient {
    public static void main(String[] args) throws IOException {
        try (DatagramSocket socket = new DatagramSocket()) {
            InetAddress serverAddress = InetAddress.getByName("localhost");
            String message = "Hello, UDP Server!";
            byte[] sendBuffer = message.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, serverAddress, 12345);
            socket.send(sendPacket);

            byte[] receiveBuffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
            socket.receive(receivePacket);
            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Server response: " + response);
        }
    }
}