使用Java抓取Socket通信TCP数据包
使用WireShark默认使用的是winpcap去抓本地环回的数据包,需要安装npcap再在Wireshark选择本地环回的网卡抓包
在Java-Socket中,在本地Socket不使用127网段无法与服务端进行通信。
但是常用的Jcap和Pcap4j都是依据libpcap/winpcap实现的。但是这俩又抓不到本地127网段的数据包。
所以选择在局域网中使用两台设备进行数据传输并抓取相应数据包
抓包需要使用的winpcap地址:www.winpcap.org/
使用Pcap4j的Maven依赖
<dependencies>
<dependency>
<groupId>org.pcap4j</groupId>
<artifactId>pcap4j-core</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.pcap4j</groupId>
<artifactId>pcap4j-packetfactory-static</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
123456789101112
服务端:
import org.pcap4j.core.*;
import org.pcap4j.packet.Packet;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void Pcap4j(InetAddress addr){
{
//1.Pcap抓取不 了本地127的包
//2.本地Socket不用127网段的包无法与服务端通信
try {
PcapNetworkInterface nif = Pcaps.getDevByAddress(addr);
int snaplen = 64 * 1024;
int timeout = 50;
//初始化抓包器
PcapHandle.Builder phb = new PcapHandle.Builder(nif.getName()).snaplen(snaplen)
.promiscuousMode(PcapNetworkInterface.PromiscuousMode.PROMISCUOUS).timeoutMillis(timeout)
.bufferSize(1 * 1024 * 1024);
PcapHandle handle = phb.build();
/** 设置TCP过滤规则 */
String filter = "tcp and port 7788";//过滤条件是tcp数据包,端口号为7788
handle.setFilter(filter, BpfProgram.BpfCompileMode.OPTIMIZE);
PacketListener listener = new PacketListener() {
@Override
public void gotPacket(Packet packet) {
System.out.println(packet);
System.out.println("-----------------------------------------");
}
};
handle.loop(3, listener);//loop里设置抓3个数据包,要无限抓设置-1
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException, PcapNativeException, NotOpenException {
ServerSocket serverSocket=new ServerSocket(7788);
System.out.println("建立服务端");
InetAddress addr=InetAddress.getLocalHost();
Pcap4j(addr);
Socket socket=serverSocket.accept();
System.out.println("连接成功");
socket.close();
serverSocket.close();
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
客户端:
import java.io.*;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.43.15",7788);
System.out.println("客户端连接成功");
socket.close();
}
}
12345678910
运行结果: