Java 中的网络基础认知

在 Java 开发中,网络编程是后端、分布式系统、微服务、游戏服务器、即时通信等领域的核心基础。Java 从 JDK 1.0 开始就提供了强大的网络支持,主要集中在 java.net 包(传统阻塞式 IO)和 java.nio 包(非阻塞 IO)。

下面从最基础的认知必须掌握的核心概念,系统梳理 Java 网络编程的知识框架。

一、网络编程最核心的两个问题

  1. 如何定位网络上的另一台机器?
    IP 地址(IPv4 / IPv6) + 端口号(0~65535)

  2. 如何在两台机器之间可靠/高效地传输数据?
    → 依赖传输层协议:TCPUDP

Java 网络编程本质上就是在操作Socket(套接字),而 Socket 是对 TCP/UDP 协议的抽象。

二、TCP vs UDP —— 必须烂熟于心的对比

维度 TCP (Transmission Control Protocol) UDP (User Datagram Protocol)
连接性 面向连接(三次握手、四次挥手) 无连接(直接发包)
可靠性 可靠(重传、确认、排序、流量控制、拥塞控制) 不可靠(丢包、乱序、重传、重复都可能发生)
传输模式 字节流(stream-oriented) 数据报(datagram-oriented,有明确边界)
传输效率 较慢(头部 20+ 字节,开销大) 快(头部仅 8 字节)
使用场景 HTTP、HTTPS、FTP、SMTP、数据库连接、RPC、聊天室等 DNS、视频/音频直播、游戏、广播、IoT 传感器等
Java 核心类 SocketServerSocket DatagramSocketDatagramPacket
是否有序 有序 无序
流量控制 有(滑动窗口)

一句话总结

  • 需要可靠、有序、不丢数据 → 选 TCP
  • 需要极致速度、低延迟、能容忍少量丢包 → 选 UDP

三、Java 网络编程三大模型(IO 模型认知)

Java 网络 IO 经历了三个时代:

模型 引入版本 核心特点 是否阻塞 适用场景 代表类
BIO JDK 1.0 阻塞式 IO,一连接一线程 阻塞 连接数少、低并发 SocketServerSocket
NIO JDK 1.4 非阻塞 IO + 多路复用(Selector) 非阻塞 中高并发、连接多但活跃少 ChannelBufferSelector
AIO JDK 1.7 异步 IO(Proactor 模型) 异步 极高并发、长连接 AsynchronousSocketChannel

2025-2026 年主流认知

  • 小型项目、学习阶段 → BIO(最简单)
  • 中大型服务器、网关、IM → NIO(Netty 是事实标准)
  • 极致性能场景 → Netty(基于 NIO 封装)或 AIO(较少使用)

四、Java 网络编程最核心的类(java.net 包)

类名 作用 典型用法场景
InetAddress 表示 IP 地址(域名解析) 获取本机 IP、解析域名
Socket 客户端 TCP 套接字 连接服务器、读写数据
ServerSocket 服务端 TCP 监听套接字 accept() 等待客户端连接
DatagramSocket UDP 发送/接收套接字 无连接 UDP 通信
DatagramPacket UDP 数据报(封装数据 + 地址) 发送/接收 UDP 包
URL / URLConnection 访问 HTTP/HTTPS/FTP 等资源 爬虫、调用 REST API
HttpURLConnection HTTP 专用连接(POST/GET/头/状态码) 传统 HTTP 客户端

现代替代

  • HTTP 客户端 → java.net.http.HttpClient(JDK 11+ 引入,推荐)
  • 高性能网络 → Netty / OkHttp / Apache HttpClient

五、必须记住的几个关键概念

  1. 端口号

    • 0~1023:知名端口(系统保留,如 80、443、3306)
    • 1024~49151:注册端口
    • 49152~65535:动态/私有端口(程序常用)
  2. 三次握手 & 四次挥手

    • 建立连接:SYN → SYN-ACK → ACK
    • 关闭连接:FIN → ACK → FIN → ACK
  3. 粘包 & 半包(TCP 特有)

    • TCP 是无边界字节流,不是一条消息对应一个包
    • 常见解决方案:
      • 定长消息
      • 特殊分隔符(\n、\0)
      • 长度前缀(最推荐:消息头 4 字节记录长度)
  4. 心跳机制

    • 防止长连接被防火墙/网关干掉
    • 常见方式:每 30s~60s 发送一次 ping/pong
  5. 域名解析

    InetAddress addr = InetAddress.getByName("www.example.com");
    

六、学习路径建议(从入门到进阶)

  1. 入门阶段(1-2 周)

    • 掌握 BIO 的 TCP 服务器/客户端(echo、聊天室)
    • 理解 UDP 的广播/组播
  2. 中级阶段(2-4 周)

    • 手写 BIO + 线程池
    • 理解粘包/半包并解决
    • 实现心跳机制
  3. 高级阶段(持续积累)

    • 深入 NIO(Channel、Buffer、Selector)
    • 学习 Netty(主流企业级选择)
    • 掌握协议设计(Protobuf、自定义二进制协议)

总结一句话认知

Java 网络编程的核心就是“用 Socket 操作 TCP/UDP 协议”,而真正决定系统能力的,是你对 IO 模型(BIO/NIO/AIO)、协议设计(粘包/心跳/分包)、并发模型(线程池/事件驱动)的理解深度。

如果你现在处于哪个阶段?

  • 刚入门,想看最简单的 TCP echo 代码?
  • 想搞懂 BIO 转 NIO 的本质区别?
  • 还是准备直接上 Netty?

告诉我,我可以给出更针对性的讲解或完整示例代码。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐