Java中TCP与UDP网络通信原理及实现代码详解

陆景行
陆景行
发布时间:2026-10-15 | 5人浏览过
原创

TCP与UDP是Java网络编程的两大核心协议。TCP通过三次握手建立可靠连接,适合对数据完整性要求高的场景;UDP面向无连接,传输速度快但不保证数据可靠性。本文将详细解析两者的工作原理,并提供Java实现的完整代码示例。

TCP与UDP协议的区别

TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)都是TCP/IP协议族的重要组成部分,但它们在连接方式、安全性及传输效率上有显著差异。

1. TCP:面向连接的可靠传输

TCP在收发数据前必须与对方建立可靠的连接。这个过程需要通过“三次握手”来完成,主要目的是同步两台主机的状态,确保双方都能正常发送和接收数据:

  1. 第一次对话:主机A向主机B发出连接请求数据包,询问是否可以发送数据。
  2. 第二次对话:主机B回复同意连接,并请求同步发送与接收状态。
  3. 第三次对话:主机A确认主机B的要求,正式准备开始数据传输。

经过这三次交互后,TCP连接建立完毕,此时才能正式传输数据。这种机制保证了传输的安全性,并能确认对方是否成功接收到信息。

2. UDP:非连接的快速传输

UDP是一个面向非连接的协议。在发送数据之前,源端和目标端不需要建立连接。它直接从应用程序抓取数据并尽可能快地发送到网络上。

  • 发送端:受限于应用程序生成数据的速度、计算机处理能力以及传输带宽。
  • 接收端:将每个消息段放入队列,应用程序按需从队列中读取。

由于省去了复杂的握手过程,UDP的传输速度非常快捷。但其代价是不保证传输的安全性,也无法确认对方是否成功接收到了信息。

Java TCP网络通信代码实现

在Java中,TCP通信主要通过 Socket 和 ServerSocket 类来实现。下面分别展示客户端(发送方)和服务端(接收方)的基础实现。

第一步:编写TCP发送端代码

发送端需要创建一个 Socket 对象连接到指定IP地址和端口,并通过输出流发送数据。为了简单起见,以下示例使用控制台输入作为发送内容,输入特定结束码(如 "1024")后断开连接。

// 向指定ip发送信息
public static void main(String[] args) throws Exception {
    // 创建Socket连接本机10000端口
    Socket s = new Socket(InetAddress.getByName(
        InetAddress.getLocalHost().getHostAddress()), 10000);
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // 封装输出流对象
    BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(s.getOutputStream()));
    
    String line;
    while (true) {
        if ((line = br.readLine()) != null) {
            // 遇到特定命令退出循环
            if ("1024".equals(line)) {
                bw.write(line);
                bw.newLine();
                break;
            }
            bw.write(line);
            bw.newLine();
        }
        bw.flush();
    }
    // 释放资源
    s.close();
}

第二步:编写TCP接收端代码

服务端使用 ServerSocket 监听指定端口,等待并接受客户端的连接请求。一旦连接建立,即可通过输入流读取数据。

// 接收发送到本机的信息
ServerSocket socket = new ServerSocket(10000);
Socket accept = socket.accept();
BufferedReader br = new BufferedReader(
    new InputStreamReader(accept.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

若要让两端同时运行并互通,可以使用多线程进行封装,以避免IO阻塞导致程序假死。

Java UDP网络通信代码实现

UDP通信在Java中通过 DatagramSocket 和 DatagramPacket 类实现。在使用UDP时,通常需要将目标IP地址设置为 ipconfig 等工具显示的局域网IP或网关地址。

第三步:编写UDP发送端代码

发送端需先创建 DatagramSocket,然后将数据打包成 DatagramPacket 对象,最后调用 send() 方法发出。

// 创建发送端的Socket对象(DatagramSocket)
// 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)

DatagramSocket ds = new DatagramSocket();
byte[] bys = "hello,udp,我来了".getBytes();
// 创建数据包:数据内容、长度、目标IP、目标端口
DatagramPacket dp = new DatagramPacket(
    bys, bys.length, InetAddress.getByName("10.102.13.18"), 10086);

// 调用DatagramSocket对象的方法发送数据
void send(DatagramPacket p); // 从此套接字发送数据报包
ds.send(dp);
System.out.println("已发送:" + new String(dp.getData(), 0, dp.getLength()));

// 关闭发送端
// void close() 关闭此数据报套接字
ds.close();

第四步:编写UDP接收端代码

接收端同样使用 DatagramSocket 监听指定端口,并使用 receive() 方法接收数据包。由于UDP是无连接的,接收端需要在固定端口持续监听。

DatagramSocket ds = new DatagramSocket(10086);
while (true) {
    // 创建一个数据包,用于接收数据
    byte[] bys = new byte[1024];
    DatagramPacket dp = new DatagramPacket(bys, bys.length);
    
    // 调用DatagramSocket对象的方法接收数据
    ds.receive(dp);
    
    System.out.println("-----");
    // 解析数据包,并把数据在控制台显示
    System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}

总结而言,TCP适用于需要高可靠性的长连接通信,而UDP则更适合追求低延迟和快速传输的场景。理解两者底层原理并掌握对应的Java API是实现稳定网络应用的基础。以上就是关于Java中TCP与UDP网络通信的详细讲解,更多关于Java网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表