急!一个jpcap抓包获取http包中url的小程序出现问题,求大神帮忙
先贴上源码:
package test2;
import java.io.File;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import java.io.RandomAccessFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
public class HTTPPacketTest {
public static void main(String[] args) throws
IOException {
/*-------------第一步绑定网络设备--------------------*/
NetworkInterface[] devices=JpcapCaptor.getDeviceList(); //返回一个网络设备列表
for(NetworkInterface n : devices)
System.out.println(n.name + " | " + n.description );
System.out.println("------------------------------------");
JpcapCaptor jpcap=null;
int caplen = 1512;
boolean promiscCheck = true;
//caplen限制每一次收到一个数据包,只提取该数据包中前多少字节
//Promisc:设置是否混杂模式。处于混杂模式将接收所有数据包,若之后又调用了包过滤函数setFilter()将不起任何作用
//50这个参数主要用于processPacket()方法,指定超时的时间
try {
jpcap=JpcapCaptor.openDevice(devices[0],caplen,promiscCheck,50);
} catch (IOException e) {
e.printStackTrace();
}
/*----------------第二步抓包---------------*/
int i = 0;
String s = null;
String result = null;
while(i < 100)
{
Packet packet = jpcap.getPacket();
if(packet instanceof TCPPacket )
{
TCPPacket tcpPacket = (TCPPacket)packet;
if(tcpPacket.src_port==80||tcpPacket.dst_port==80) //定义为80号端口,确定为HTTP数据包
{
i++;
System.out.print("数据:\n");
for (i = 0; i < tcpPacket.data.length; i++) {
System.out.print((char)tcpPacket.data[i]);
}
try
{
File file = new File("D:\\about.txt");
if(!file.exists()){
file.createNewFile();
}
//byte[] b=result.getBytes();
//FileOutputStream fout=new FileOutputStream(myFile);
RandomAccessFile raf=new RandomAccessFile(file,"rw"); //保存在记事本文件中
raf.seek(raf.length());
if(raf.read()!=-1) {
raf.writeByte(tcpPacket.data[i]);
}
while(raf.read()!=-1){
s = raf.readLine();
System.out.println(s);
//正则式匹配,抓取文件中的url
Pattern p = Pattern.compile("Referer:(.*?)(html)");
Matcher m = p.matcher(s);
if (m.find()) {
result = m.group(1)+m.group(2);
}
System.out.println("结果集输出:"+result);
/*Pattern p = Pattern.compile("Referer:(.*?)Accept-Encoding:");
Matcher m = p.matcher(string);
if (m.find()) {
System.out.println("正则输出:"+m.group(1));
}*/
raf.close();
}
}
catch(
FileNotFoundException e)
{
System.err.println(e);
}
catch(IOException e)
{
System.err.println(e);
} //异常情况的处理
}
}
}
}
}
运行一下可以发现,正则表达式根本就没有配比输出,查了一下,应该是编码问题,请教做过的前辈们帮个忙,帮忙给条出路啊!!!
------解决方案--------------------
你现在问题没有准确获取到数据包的编码,数据解析为乱码。要获取到数据包的自然码,不然无法知道数据的编码。