我们一般都是基于传输层进行编程,你如果希望基于网络层进行编程,建议采用c/c++来实现,java api里面可能没有。

解决方案 »

  1.   

    修改TCP报文头...这个过于底层, 平常见到的交互协议之类的都是在上层, 路过,没搞过.
      

  2.   

    我发一个我自己定义的应用层报文件头给你看看:QQ信息事件报文: QF10F0 
    采用16进制,如下:
    顺序 类型及长度 含义
    1 byte(1) QF (6字节开始)
    2 byte(1) 10
    3 byte(1) QF
    4 byte(1) 10
    5 byte(1) QF
    6 byte(1) 10
    7 byte(1) 报文字节顺序(高字段在前: 1,底字节在前: 0)
    8 byte(1) F0 (事件类型)
    9 byte(1) 年(日期从2000年起计序号) 
    10 byte(1) 月 
    11 byte(1) 日
    12 byte(1) 时  
    13 byte(1) 分   
    14 byte(1) 秒 
    15              byte(1) 内容长度
    16              byte(N) 15中规定的字节长度的数据.
      

  3.   

    我配置好了jpcap的环境了,但是api还不是太明白。不知道怎么三次握手建立tcp连接再发送tcp报文...
      

  4.   

    嗯,查了很多资料,确实没有,但是有基于jni调用wincap的jpcap可以实现....
      

  5.   

    tcp连接 就是在java里用 Socket,
    三次握手,这只是一种方式,你连上后直接发也没有人管你.
    三次握手只是做一种比较严格的机制, 如果你定义 10次握手发送难道就不行么.
    只能说 3次是比较正常的处理方法. /**
     * @param args
     */
    public static void main(String[] args) {
    try{
    Socket sock = new Socket("127.0.0.1", 9002);
    InputStream sin = sock.getInputStream();
    OutputStream out = sock.getOutputStream();
    ByteArrayOutputStream buffeOut =new ByteArrayOutputStream();
    List<My> list =null;
    long tv1 =0;
    long tv2 =0;
    int ava=0;
    int sum=0;
    String strout ="";
    for(int i=0; i<10000; i++){
    //发送
    if(list==null) list=getSendData();
    sum=0;
    My e =null;
    strout ="";
    byte[] bb = new byte[1024];
    tv1 =System.currentTimeMillis();
    for(int j=0; j<50; j++){
    e =list.get(j);
    strout =strout+e.getId()+" "+e.getDescrb()+"\r\n";
    }
    bb =strout.getBytes("utf-8");
    sum =sum + bb.length;
    out.write(bb);
    out.flush();
    tv2 =System.currentTimeMillis();
    System.out.println("发送: " + strout);
    System.out.println(i+",发送: 长度"+sum+",用时: "+(tv2-tv1));
    //接收
    sum=0;
    ava =sin.available();
    byte inBuf[] = new byte[512];
    int c;
    if(ava>0){
    while ((c = sin.read(inBuf)) != -1) {
    buffeOut.write(inBuf, 0, c);
    sum =sum+c;
    ava =sin.available();
    if(ava<=0){
    Thread.sleep(100);
    ava =sin.available();
    if(ava<=0) break;
    }
    }
    String strin = new String(buffeOut.toByteArray(),"utf-8");
    System.out.println(i+",接收: " + strin);
    buffeOut.reset();
    }
    Thread.sleep(200);
    }
    Thread.sleep(5000);
    sock.shutdownOutput();
    out.close();
    sin.close();
    sock.close();
    buffeOut.close();
    } catch (IOException ie) {
    System.out.println("服务器异常");
    ie.printStackTrace();
    }catch (Exception ex) {
    System.out.println("服务器异常");
    ex.printStackTrace();
    } finally {
    System.out.println("Request,NOsssssss.");
    }
    }
      

  6.   

    一般定义一个一定格式的字符串就能满足要求
    如果要用类来定义,先让该头部类序列化,然后使用ObjectOutputStream把对象转为字节流发送,然后接收端再使用ObjectOutputStream把对象字节流还原成对象,然后再读取对象的属性值就行了
    思路就是这样~