java socket 包头包体_使用JAVA上抓取Socket服务端和客户端通信TCP数据包
使用Java抓取Socket通信TCP數據包
使用WireShark默認使用的是winpcap去抓本地環回的數據包,需要安裝npcap再在Wireshark選擇本地環回的網卡抓包
在Java-Socket中,在本地Socket不使用127網段無法與服務端進行通信。
但是常用的Jcap和Pcap4j都是依據libpcap/winpcap實現的。但是這倆又抓不到本地127網段的數據包。
所以選擇在局域網中使用兩臺設備進行數據傳輸并抓取相應數據包
抓包需要使用的winpcap地址:www.winpcap.org/
使用Pcap4j的Maven依賴
org.pcap4j
pcap4j-core
1.7.5
org.pcap4j
pcap4j-packetfactory-static
1.7.5
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復制代碼
運行結果:
總結
以上是生活随笔為你收集整理的java socket 包头包体_使用JAVA上抓取Socket服务端和客户端通信TCP数据包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenJudge NOI 1.16 0
- 下一篇: 高桥盾react和boost_gel、r