网络编程是开发分布式系统、微服务、IM 通信、游戏服务器等应用的基础。Java 提供了丰富的网络类库,包括底层的 Socket 到高性能的异步框架 Netty,使得构建跨平台、高并发的网络应用成为可能。
mathematica复制编辑java.net 包
├── Socket / ServerSocket (TCP 编程)
├── DatagramSocket / DatagramPacket(UDP 编程)
├── URL / HttpURLConnection(HTTP 网络通信)
└── NIO(非阻塞通信)
└── Netty(高性能网络通信框架)TCP 是面向连接的通信协议,适合传输大量可靠数据。
java复制编辑ServerSocket serverSocket = new ServerSocket(8888);
Socket client = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println("收到消息:" + in.readLine());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();pgsql复制编辑+-----------+ +------------+
| Client | ← TCP/IP → | Server |
| (Socket) | ---- connect -->| ServerSocket |
+-----------+ +------------+工作流程:
ServerSocket
Socket.connect
避免使用 read() 单字节读取,推荐使用 BufferedReader / BufferedWriter 包装提高性能。
java复制编辑while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> handleClient(socket)).start();
}UDP 不保证数据顺序与可靠性,适用于实时性要求高的应用,如视频通话、游戏通信。
java复制编辑DatagramSocket socket = new DatagramSocket();
byte[] data = "UDP消息".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 6666);
socket.send(packet);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()));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());NIO(New I/O)是 Java 1.4 引入的新特性,支持非阻塞式通信。
组件 | 说明 |
|---|---|
Channel | 数据读写通道 |
Buffer | 缓冲区,用于数据中转 |
Selector | 多路复用器,监控通道事件 |
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<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
if (key.isAcceptable()) {
// 处理连接
} else if (key.isReadable()) {
// 读取数据
}
}
}Netty 是基于 NIO 封装的异步事件驱动通信框架,广泛应用于:
markdown复制编辑客户端请求
↓
BossGroup(接收连接)
↓
WorkerGroup(处理IO读写)
↓
Pipeline(Handler 链)java复制编辑EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new SimpleChannelInboundHandler<ByteBuf>() {
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
System.out.println("收到数据:" + msg.toString(Charset.defaultCharset()));
}
});
}
});
bootstrap.bind(8888).sync();java复制编辑Bootstrap bootstrap = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
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();特性 | 说明 |
|---|---|
高性能 | 异步非阻塞,IO效率高 |
线程模型清晰 | Boss/Worker 分离 |
可扩展性强 | Handler 链式结构 |
支持多种协议 | TCP、UDP、HTTP、自定义协议 |
社区活跃,文档丰富 | 广泛用于开源项目 |
TCP 是流式协议,可能出现多条消息合并(粘包)或分割(拆包)问题。
\n、EOF)
建议 | 说明 |
|---|---|
使用线程池处理并发连接 | 避免创建太多线程耗尽资源 |
合理设置 socket 超时时间 | 防止阻塞 |
输入输出使用缓冲流提高效率 | 比单字节读写性能更佳 |
使用协议封装消息结构 | 保证通信规范、可扩展 |
使用 Netty 管理连接生命周期 | 连接、心跳、重连统一管理 |
工具 | 用途 |
|---|---|
Wireshark | 抓包工具,分析数据流 |
Netstat | 查看端口与连接状态 |
Telnet / nc | 测试端口连通性 |
Postman | 测试 HTTP 接口 |
问题 | 简要回答 |
|---|---|
TCP 与 UDP 区别 | 有连接/无连接,可靠性/速度 |
Socket 如何实现通信? | 建立连接 → 获取流 → 读写数据 |
如何解决粘包拆包问题? | 定长、分隔符、消息头记录长度 |
什么是 NIO?Netty 有什么优点? | 非阻塞IO,高性能,封装更好 |
Selector 工作原理? | 注册 Channel → select 轮询事件 |
Java 网络编程体系非常庞大,从最底层的 Socket 到 NIO/Netty 框架都值得深入研究。掌握网络通信的原理、协议、线程模型,将极大提升构建高并发、高可用系统的能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。