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);
}
}
}