【问题标题】:How to print all package HTTP如何打印所有包 HTTP
【发布时间】:2015-11-27 15:43:39
【问题描述】:

a 只想打印如下所示的所有包。其简单的 HTTP 分析器 java 代码。请查看我的主要内容。我如何打印协议名称或其他功能。谢谢你

//package jdumper.analyzer;
import jpcap.packet.*;
import java.util.*;
import java.io.*;



public class HTTPAnalyzer extends JDPacketAnalyzer
{

private static HTTPAnalyzer analy;

public static void main(String arg[] )
{
    System.out.println(boom.getValueNames());;
}

private static final String[] valueNames={
    "Method",
    "Header"
};

String method;

Vector headers=new Vector();

public HTTPAnalyzer(){
    layer=APPLICATION_LAYER;
}

public boolean isAnalyzable(Packet p){
    if(p instanceof TCPPacket &&
       (((TCPPacket)p).src_port==80 || ((TCPPacket)p).dst_port==80))
        return true;
    else return false;
}



public String getProtocolName(){
    return "HTTP";
}

public String[] getValueNames(){
    return valueNames;
}

public void analyze(Packet p){
    method="";
    headers.removeAllElements();

    if(!isAnalyzable(p)) return;

    try{
        BufferedReader in=new BufferedReader(new StringReader(new String(p.data)));

        method=in.readLine();

        if(method==null || method.indexOf("HTTP")==-1){

            // this packet doesn't contain HTTP header
            method="Not HTTP Header";

            return;
        }


        String l;

        //read headers

        while((l=in.readLine()).length()>0)

            headers.addElement(l);

    }catch(IOException e){}

}



public Object getValue(String valueName){

    if(valueNames[0].equals(valueName)) return method;

    if(valueNames[1].equals(valueName)) return headers;

    return null;

}



Object getValueAt(int index){

    if(index==0) return method;

    if(index==1) return headers;

    return null;

}



public Object[] getValues(){

    Object[] values=new Object[2];

    values[0]=method;

    values[1]=headers;



    return values;

}

}

【问题讨论】:

  • 我想从你扩展的类中你正在使用来自 jpcap.sourceforge.net 的 jpcap。如果是这种情况,请更具体地说明您需要打印什么。
  • 谢谢你回答我的问题。你能告诉我如何打印 HTTP 所有包吗
  • 我很乐意,但我需要了解您所说的“包”是什么意思。你是说头条吗?响应机构?数据包的全文?
  • 是的,我的意思是 HTTP 标头

标签: java linux server


【解决方案1】:

这就是问题所在。 HTTP 是基于流的协议 - 它运行在 TCP/IP 流上。为了准确地解析/提取 HTTP 流的标头,您首先需要从数据包中重新组合流。一旦你(准确地)完成了,你就可以解析流并提取标题。但是,如果您只是查看 HTTP 流中的各个数据包,您无法可靠地判断哪些数据包包含标头,哪些是 HTTP 请求或响应正文的一部分。


忽略这个问题,我很难弄清楚 jpcap / jpcap / jdumper / 无论你的班级应该针对什么版本。这使得很难弄清楚应该如何使用JDPacketAnalyzer 的子类。但我很确定它不应该有 main 方法。

【讨论】:

  • 如果我想在 Linux 的终端打印所有捕获的包。我该怎么做?
  • 安装 tcpdump 或 wireshark 或类似的。这不是编程问题。
猜你喜欢
  • 2014-10-22
  • 1970-01-01
  • 2021-12-13
  • 2015-01-13
  • 1970-01-01
  • 2022-11-29
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多