日期:2014-05-20  浏览次数:20973 次

急!一个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);
} //异常情况的处理
}
}
}
}
}

运行一下可以发现,正则表达式根本就没有配比输出,查了一下,应该是编码问题,请教做过的前辈们帮个忙,帮忙给条出路啊!!!

------解决方案--------------------
你现在问题没有准确获取到数据包的编码,数据解析为乱码。要获取到数据包的自然码,不然无法知道数据的编码。