Java中的网络基础认知

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 核心类SocketServerSocketDatagramSocketDatagramPacket
是否有序有序无序
流量控制有(滑动窗口)

一句话总结

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

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

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

模型引入版本核心特点是否阻塞适用场景代表类
BIOJDK 1.0阻塞式 IO,一连接一线程阻塞连接数少、低并发SocketServerSocket
NIOJDK 1.4非阻塞 IO + 多路复用(Selector)非阻塞中高并发、连接多但活跃少ChannelBufferSelector
AIOJDK 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() 等待客户端连接
DatagramSocketUDP 发送/接收套接字无连接 UDP 通信
DatagramPacketUDP 数据报(封装数据 + 地址)发送/接收 UDP 包
URL / URLConnection访问 HTTP/HTTPS/FTP 等资源爬虫、调用 REST API
HttpURLConnectionHTTP 专用连接(POST/GET/头/状态码)传统 HTTP 客户端

现代替代

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

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

  1. 端口号
  • 0~1023:知名端口(系统保留,如 80、443、3306)
  • 1024~49151:注册端口
  • 49152~65535:动态/私有端口(程序常用)
  1. 三次握手 & 四次挥手
  • 建立连接:SYN → SYN-ACK → ACK
  • 关闭连接:FIN → ACK → FIN → ACK
  1. 粘包 & 半包(TCP 特有)
  • TCP 是无边界字节流,不是一条消息对应一个包
  • 常见解决方案:
    • 定长消息
    • 特殊分隔符(\n、\0)
    • 长度前缀(最推荐:消息头 4 字节记录长度)
  1. 心跳机制
  • 防止长连接被防火墙/网关干掉
  • 常见方式:每 30s~60s 发送一次 ping/pong
  1. 域名解析
   InetAddress addr = InetAddress.getByName("www.example.com");

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

  1. 入门阶段(1-2 周)
  • 掌握 BIO 的 TCP 服务器/客户端(echo、聊天室)
  • 理解 UDP 的广播/组播
  1. 中级阶段(2-4 周)
  • 手写 BIO + 线程池
  • 理解粘包/半包并解决
  • 实现心跳机制
  1. 高级阶段(持续积累)
  • 深入 NIO(Channel、Buffer、Selector)
  • 学习 Netty(主流企业级选择)
  • 掌握协议设计(Protobuf、自定义二进制协议)

总结一句话认知

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

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

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

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

文章已创建 4391

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部