在 Java 中“解析网络协议”通常分几种情况,不同协议、不同层次做法差别很大。下面按常见场景 + 示例给你一个清晰路线图。
| 层级 | 协议示例 | Java 处理方式 |
|---|---|---|
| 传输层 | TCP / UDP | Socket |
| 应用层(文本) | HTTP、FTP、SMTP | 库 / 手写解析 |
| 应用层(二进制) | 自定义协议、MQTT、Redis | ByteBuffer 手动解析 |
| 网络层 | IP、ICMP | 抓包 + 解析(JNetPcap) |
// OkHttp / HttpClient
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("http://example.com")).build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
Socket socket = new Socket("example.com", 80);
socket.getOutputStream().write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n".getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = reader.readLine()) != null && !line.isEmpty()) {
System.out.println(line);
}
| 长度(4字节) | 数据 |
Socket socket = new Socket("localhost", 9000);
DataInputStream in = new DataInputStream(socket.getInputStream());
int len = in.readInt(); // 读长度
byte[] data = new byte[len];
in.readFully(data); // 读数据
String msg = new ByteBuffer.wrap(data).toString();
✅ 关键类:
DataInputStreamByteBufferObjectInputStream(Java 原生序列化,不推荐)DatagramSocket socket = new DatagramSocket(9999);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
ByteBuffer buffer = ByteBuffer.wrap(packet.getData(), 0, packet.getLength());
<dependency>
<groupId>org.jnetpcap</groupId>
<artifactId>jnetpcap</artifactId>
</dependency>
Pcap pcap = Pcap.openLive("eth0", 65536, true, 1000);
pcap.loop(10, (header, buffer) -> {
Ethernet eth = new Ethernet(buffer);
Ip4 ip = eth.getIp4();
Tcp tcp = ip.getTcp();
});
⚠️ 需要 root / 管理员权限
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
// 判断是否满足一个完整包
}
| 用途 | 库 |
|---|---|
| HTTP | OkHttp、HttpClient |
| 高性能网络 | Netty |
| 二进制协议 | ByteBuffer、Netty ByteBuf |
| 抓包 | JNetPcap、Pcap4J |
| 序列化 | Protobuf、MsgPack |
你可以直接把:
“我要解析 XXX 协议,报文长这样:……”
发给我。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。