Java 中的网络基础认知
在 Java 开发中,网络编程是后端、分布式系统、微服务、游戏服务器、即时通信等领域的核心基础。Java 从 JDK 1.0 开始就提供了强大的网络支持,主要集中在 java.net 包(传统阻塞式 IO)和 java.nio 包(非阻塞 IO)。
下面从最基础的认知到必须掌握的核心概念,系统梳理 Java 网络编程的知识框架。
一、网络编程最核心的两个问题
- 如何定位网络上的另一台机器?
→ IP 地址(IPv4 / IPv6) + 端口号(0~65535) - 如何在两台机器之间可靠/高效地传输数据?
→ 依赖传输层协议:TCP 或 UDP
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 核心类 | Socket、ServerSocket | DatagramSocket、DatagramPacket |
| 是否有序 | 有序 | 无序 |
| 流量控制 | 有(滑动窗口) | 无 |
一句话总结:
- 需要可靠、有序、不丢数据 → 选 TCP
- 需要极致速度、低延迟、能容忍少量丢包 → 选 UDP
三、Java 网络编程三大模型(IO 模型认知)
Java 网络 IO 经历了三个时代:
| 模型 | 引入版本 | 核心特点 | 是否阻塞 | 适用场景 | 代表类 |
|---|---|---|---|---|---|
| BIO | JDK 1.0 | 阻塞式 IO,一连接一线程 | 阻塞 | 连接数少、低并发 | Socket、ServerSocket |
| NIO | JDK 1.4 | 非阻塞 IO + 多路复用(Selector) | 非阻塞 | 中高并发、连接多但活跃少 | Channel、Buffer、Selector |
| 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
五、必须记住的几个关键概念
- 端口号
- 0~1023:知名端口(系统保留,如 80、443、3306)
- 1024~49151:注册端口
- 49152~65535:动态/私有端口(程序常用)
- 三次握手 & 四次挥手
- 建立连接:SYN → SYN-ACK → ACK
- 关闭连接:FIN → ACK → FIN → ACK
- 粘包 & 半包(TCP 特有)
- TCP 是无边界字节流,不是一条消息对应一个包
- 常见解决方案:
- 定长消息
- 特殊分隔符(\n、\0)
- 长度前缀(最推荐:消息头 4 字节记录长度)
- 心跳机制
- 防止长连接被防火墙/网关干掉
- 常见方式:每 30s~60s 发送一次 ping/pong
- 域名解析
InetAddress addr = InetAddress.getByName("www.example.com");
六、学习路径建议(从入门到进阶)
- 入门阶段(1-2 周)
- 掌握 BIO 的 TCP 服务器/客户端(echo、聊天室)
- 理解 UDP 的广播/组播
- 中级阶段(2-4 周)
- 手写 BIO + 线程池
- 理解粘包/半包并解决
- 实现心跳机制
- 高级阶段(持续积累)
- 深入 NIO(Channel、Buffer、Selector)
- 学习 Netty(主流企业级选择)
- 掌握协议设计(Protobuf、自定义二进制协议)
总结一句话认知
Java 网络编程的核心就是“用 Socket 操作 TCP/UDP 协议”,而真正决定系统能力的,是你对 IO 模型(BIO/NIO/AIO)、协议设计(粘包/心跳/分包)、并发模型(线程池/事件驱动)的理解深度。
如果你现在处于哪个阶段?
- 刚入门,想看最简单的 TCP echo 代码?
- 想搞懂 BIO 转 NIO 的本质区别?
- 还是准备直接上 Netty?
告诉我,我可以给出更针对性的讲解或完整示例代码。