一、引言:网络编程为何是 Java 开发核心能力?网络编程是开发分布式系统、微服务、IM 通信、游戏服务器等应用的基础。Java 提供了丰富的网络类库,包括底层的 Socket 到高性能的异步框架 Netty,使得构建跨平台、高并发的网络应用成为可能。
二、Java 网络编程体系图示代码语言:javascript复制mathematica复制编辑java.net 包
├── Socket / ServerSocket (TCP 编程)
├── DatagramSocket / DatagramPacket(UDP 编程)
├── URL / HttpURLConnection(HTTP 网络通信)
└── NIO(非阻塞通信)
└── Netty(高性能网络通信框架)三、Java Socket 编程基础3.1 基本 TCP 通信模型TCP 是面向连接的通信协议,适合传输大量可靠数据。
服务端:代码语言:javascript复制java复制编辑ServerSocket serverSocket = new ServerSocket(8888);
Socket client = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println("收到消息:" + in.readLine());客户端:代码语言:javascript复制java复制编辑Socket socket = new Socket("127.0.0.1", 8888);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("Hello Server\n");
out.flush();四、Socket 通信图解代码语言:javascript复制pgsql复制编辑+-----------+ +------------+
| Client | ← TCP/IP → | Server |
| (Socket) | ---- connect -->| ServerSocket |
+-----------+ +------------+工作流程:
服务端监听端口 ServerSocket
客户端发起连接 Socket.connect
建立连接后输入输出流通信
双方关闭连接
五、Socket 编程细节与封装5.1 输入输出流缓冲避免使用 read() 单字节读取,推荐使用 BufferedReader / BufferedWriter 包装提高性能。
5.2 多线程处理每个客户端代码语言:javascript复制java复制编辑while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> handleClient(socket)).start();
}六、UDP 编程基础UDP 不保证数据顺序与可靠性,适用于实时性要求高的应用,如视频通话、游戏通信。
6.1 发送端代码语言:javascript复制java复制编辑DatagramSocket socket = new DatagramSocket();
byte[] data = "UDP消息".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 6666);
socket.send(packet);6.2 接收端代码语言:javascript复制java复制编辑DatagramSocket socket = new DatagramSocket(6666);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(), 0, packet.getLength()));七、HTTP 通信:HttpURLConnection 简介代码语言:javascript复制java复制编辑URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
System.out.println(reader.readLine());八、Java NIO 非阻塞通信模型NIO(New I/O)是 Java 1.4 引入的新特性,支持非阻塞式通信。
8.1 核心组件组件
说明
Channel
数据读写通道
Buffer
缓冲区,用于数据中转
Selector
多路复用器,监控通道事件
8.2 NIO 示例简略代码代码语言:javascript复制java复制编辑Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
// 主循环监听
while (selector.select() > 0) {
Set
for (SelectionKey key : keys) {
if (key.isAcceptable()) {
// 处理连接
} else if (key.isReadable()) {
// 读取数据
}
}
}九、Netty 框架:构建高性能通信系统Netty 是基于 NIO 封装的异步事件驱动通信框架,广泛应用于:
RPC 框架(Dubbo)
网关(Zuul、Spring Cloud Gateway)
游戏服务器
IM 系统(即时通讯)
十、Netty 架构图与线程模型代码语言:javascript复制markdown复制编辑客户端请求
↓
BossGroup(接收连接)
↓
WorkerGroup(处理IO读写)
↓
Pipeline(Handler 链)十一、Netty 入门示例11.1 服务端代码语言:javascript复制java复制编辑EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new SimpleChannelInboundHandler
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
System.out.println("收到数据:" + msg.toString(Charset.defaultCharset()));
}
});
}
});
bootstrap.bind(8888).sync();11.2 客户端代码语言:javascript复制java复制编辑Bootstrap bootstrap = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty", Charset.defaultCharset()));
}
});
}
});
bootstrap.connect("localhost", 8888).sync();十二、Netty 核心特性总结特性
说明
高性能
异步非阻塞,IO效率高
线程模型清晰
Boss/Worker 分离
可扩展性强
Handler 链式结构
支持多种协议
TCP、UDP、HTTP、自定义协议
社区活跃,文档丰富
广泛用于开源项目
十三、网络通信中的粘包与拆包问题原因:TCP 是流式协议,可能出现多条消息合并(粘包)或分割(拆包)问题。
解决方案: 消息定长(如每次读取 1024 字节)
使用分隔符(如 \n、EOF)
使用消息头记录消息长度(推荐)
十四、网络编程实战技巧与建议建议
说明
使用线程池处理并发连接
避免创建太多线程耗尽资源
合理设置 socket 超时时间
防止阻塞
输入输出使用缓冲流提高效率
比单字节读写性能更佳
使用协议封装消息结构
保证通信规范、可扩展
使用 Netty 管理连接生命周期
连接、心跳、重连统一管理
十五、网络调试与分析工具工具
用途
Wireshark
抓包工具,分析数据流
Netstat
查看端口与连接状态
Telnet / nc
测试端口连通性
Postman
测试 HTTP 接口
十六、面试热点题速查表问题
简要回答
TCP 与 UDP 区别
有连接/无连接,可靠性/速度
Socket 如何实现通信?
建立连接 → 获取流 → 读写数据
如何解决粘包拆包问题?
定长、分隔符、消息头记录长度
什么是 NIO?Netty 有什么优点?
非阻塞IO,高性能,封装更好
Selector 工作原理?
注册 Channel → select 轮询事件
十七、总结与展望Java 网络编程体系非常庞大,从最底层的 Socket 到 NIO/Netty 框架都值得深入研究。掌握网络通信的原理、协议、线程模型,将极大提升构建高并发、高可用系统的能力。