使用JAVA上抓取Socket服务端和客户端通信TCP数据包

977 阅读2分钟

使用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

运行结果:在这里插入图片描述

在这里插入图片描述在这里插入图片描述