Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)

众所周知,Java语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。

     JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft windows 2000/XP等系统。

     使用Jpcap能做的事:

1.Jpcap是直接抓取经过数据链路层的数据包。 因此可以自己写IP数据包直接发送给数据链路层。

2.Jpcap会对抓取到的数据包进行一定程序的解析,根据数据包内容,将数据包封装为对应的对象()。

3.根据用户设定的信息,过滤数据包(其实就是在解析的时候,对不需要的数据直接丢弃,不解析)

4.Jpcap 只是直接从数据链路层上读取数据,并向数据链路层中发送数据,因此,Jpcap并不能操作 其他程序从数据链路层中读数据或者向网卡中发送数据。(IP层协议程序)

二话不说首先我们先上项目结构

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第1张图片

所需要的jar包我已打包好

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第2张图片

0、客户端  InfraredSensorClient.java

package com.airtimes.netty.network.client;


import com.airtimes.netty.network.client.handler.InfraredSensorClientHandler;

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;


/**
 * 
 * 服务器持续监听宿主机的网卡信息、并时时返回报警中心协议在网卡中交换的数据
 * 客户端接收服务器端数据,打印出服务器送的消息
 * 
 */

public class InfraredSensorClient {

    public static void main(String[] args)
        throws Exception {

        // 创建EventLoopGroup线程池 Netty内部都是通过线程在处理数据
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            // 创建客户端连接基类 用于连接服务器
            Bootstrap bootstrap = new Bootstrap(); // (1)
            // 将 EventLoopGroup 加入线程池
            bootstrap.group(workerGroup); // (2)
            // 使用changlefactory 创建通信频道
            bootstrap.channel(NioSocketChannel.class); // (3)
            // Socket网路属性
            bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // (4)
            // channel处理类
            bootstrap.handler(new ChannelInitializer() {
                // 初始化channel
                @Override
                public void initChannel(SocketChannel channel)
                    throws Exception {

                    channel.pipeline().addLast(new InfraredSensorClientHandler());

                }

            });

            // Start the client.
            // 启动客户端
            ChannelFuture f = bootstrap.connect("127.0.0.1", 9090).sync(); // (5)

            // Wait until the connection is closed.
            // 等待连接关闭
            f.channel().closeFuture().sync();

        }
        finally {
            workerGroup.shutdownGracefully();
        }

    }
}

            1、客户端Handler  InfraredSensorClientHandler .java

package com.airtimes.netty.network.client.handler;


import java.io.IOException;

import com.airtimes.netty.network.response.Message;
import com.airtimes.netty.network.tools.Util;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;


public class InfraredSensorClientHandler extends ChannelInboundHandlerAdapter {

    private static final Util util = new Util();

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {

        try {

            ByteBuf m = (ByteBuf)msg;
            String response = util.convertByteBufToString(m);
            System.out.println("收到来自服务器json信息: " + response + "\n");
            ObjectMapper objectMapper = new ObjectMapper();
            Message ClientMessage = objectMapper.readValue(response, Message.class);
            System.out.println("收到来自服务器对象信息: " + ClientMessage.toString() + "\n");

        }
        catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {

            ReferenceCountUtil.release(msg);

        }

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}

           2、服务器端  InfraredSensorServer  .java

package com.airtimes.netty.network.server;


import com.airtimes.netty.network.server.handler.InfraredSensorServerHandler;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.timeout.ReadTimeoutHandler;

import io.netty.handler.timeout.WriteTimeoutHandler;


public class InfraredSensorServer {

    public static void main(String[] args) {

        // EventLoop 代替原来的 ChannelFactory

        EventLoopGroup bossGroup = new NioEventLoopGroup();

        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {

            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(bossGroup, workerGroup)

                .channel(NioServerSocketChannel.class)

                .childHandler(new ChannelInitializer() {

                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {

                        ch.pipeline().addLast(

                            new InfraredSensorServerHandler(),

                            new WriteTimeoutHandler(10),

                            // 控制写入超时10秒构造参数10表示如果持续10秒钟都没有数据写了,那么就超时。

                            new ReadTimeoutHandler(10)

                );
                    }

                }).option(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = serverBootstrap.bind(9090).sync();

            f.channel().closeFuture().sync();

        }
        catch (InterruptedException e) {

        }
        finally {

            workerGroup.shutdownGracefully();

            bossGroup.shutdownGracefully();

        }

    }
}

     3、服务器端Handler  InfraredSensorServerHandler .java

package com.airtimes.netty.network.server.handler;


import java.io.IOException;
import java.util.Date;
import java.util.UUID;

import com.airtimes.netty.network.response.Message;
import com.airtimes.netty.network.tools.TranscodingUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.EthernetPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;


public class InfraredSensorServerHandler extends ChannelInboundHandlerAdapter {

    private static final int caplen = 65535;

    private static final boolean promiscCheck = true;

    private static int f = 0;

    private static int i = 0;

    // ChannelHandlerContext通道处理上下文
    @Override
    public void channelActive(final ChannelHandlerContext ctx)
        throws InterruptedException,
        JsonProcessingException { // (1)

        // 第一步绑定网络设备
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        for (NetworkInterface n : devices) {
            System.out.println("获取到本地网卡信息列表" + n.name + "     |     " + n.description);

        }
        System.out.println("-----------------------------------------------------------------");

        JpcapCaptor jpcap = null;

        try {
            jpcap = JpcapCaptor.openDevice(devices[2], caplen, promiscCheck, 50);
            // 指定筛选条件
            jpcap.setFilter("src 192.168.208.200 && len > 220 && len < 300 ", true);
            /* jpcap.setFilter("src 192.168.208.200 or 192.168.208.199  and len < 230 ",true); */
            // 0 或 1
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        // 第二步抓包
        while (true) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket && ((IPPacket)packet).version == 4) {
                
                i++ ;
                IPPacket ip = (IPPacket)packet;// 强转

                System.out.println("-------------------------------------第" + i + "次抓取数据包参数信息--------------------------------------------");

                System.out.println("版本:" + ip.version);
                System.out.println("优先权:" + ip.priority);
                System.out.println("区分服务:最大的吞吐量: " + ip.t_flag);
                System.out.println("区分服务:最高的可靠性:" + ip.r_flag);
                System.out.println("长度:" + ip.length);
                System.out.println("标识:" + ip.ident);
                System.out.println("DF:Don't Fragment: " + ip.dont_frag);
                System.out.println("NF:Nore Fragment: " + ip.more_frag);
                System.out.println("片偏移:" + ip.offset);
                System.out.println("生存时间:" + ip.hop_limit);

                String protocol = "";
                switch (new Integer(ip.protocol)) {
                    case 1:
                        protocol = "ICMP";
                        break;
                    case 2:
                        protocol = "IGMP";
                        break;
                    case 6:
                        protocol = "TCP";
                        break;
                    case 8:
                        protocol = "EGP";
                        break;
                    case 9:
                        protocol = "IGP";
                        break;
                    case 17:
                        protocol = "UDP";
                        break;
                    case 41:
                        protocol = "IPv6";
                        break;
                    case 89:
                        protocol = "OSPF";
                        break;
                    default:
                        break;
                }

                System.out.println("协议:" + protocol);
                System.out.println("源IP " + ip.src_ip.getHostAddress());
                System.out.println("目的IP " + ip.dst_ip.getHostAddress());
                /*
                 * System.out.println("源主机名: " + ip.src_ip); System.out.println("目的主机名: " + ip.dst_ip);
                 */
                TranscodingUtil transcodingUtil = new TranscodingUtil();
                String hexString = transcodingUtil.toHexString(ip.data);
                String hexStringToString = transcodingUtil.hexStringToString(hexString);

                String hexStringHead = transcodingUtil.toHexString(ip.header);
                String StringHead = transcodingUtil.hexStringToString(hexStringHead);

                /**********************
                 * 0-31
                 * ******************************************/
                String substring0 = hexString.substring(0, 32);
                System.out.println("0-31频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring0));
                System.out.println("0-31频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring0));
                System.out.println("0-31频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring0));
                System.out.println("0-31频段数据GB2312:" + transcodingUtil.hexStringToString(substring0));
                System.out.println("0-31频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring0));
                System.out.println("0-31频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring0));
                System.out.println("0-31频段数据十进制      :" + transcodingUtil.transcoding(substring0));
                System.out.println("0-31频段数据十六进制  :" + substring0);
                System.out.println("---------------------------------------------------------------------------------");

                /**********************
                 * 32-39 错误类型
                 * B7C0 C7F8 B8D0 D3A6 C6F7 B7C0 B2F0 BBD6 B8B4 防拆恢复
                 * ******************************************/
                String substring = hexString.substring(32, 40);
                System.out.println("32-39频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring));
                System.out.println("32-39频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring));
                System.out.println("32-39频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring));
                System.out.println("32-39频段数据GB2312:" + transcodingUtil.hexStringToString(substring));
                System.out.println("32-39频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring));
                System.out.println("32-39频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring));
                System.out.println("32-39频段数据十进制      :" + transcodingUtil.transcoding(substring));
                System.out.println("32-39频段数据十六进制  :" + substring);
                System.out.println("---------------------------------------------------------------------------------");

                /**********************
                 * 40-78
                 * B7C0 C7F8 B8D0 D3A6 C6F7 B7C0 B2F0 BBD6 B8B4 防拆恢复
                 * ******************************************/
                String substring6 = hexString.substring(40, 78);
                System.out.println("40-78频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring6));
                System.out.println("40-78频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring6));
                System.out.println("40-78频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring6));
                System.out.println("40-78频段数据GB2312:" + transcodingUtil.hexStringToString(substring6));
                System.out.println("40-78频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring6));
                System.out.println("40-78频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring6));
                System.out.println("40-78频段数据十进制      :" + transcodingUtil.transcoding(substring6));
                System.out.println("40-78频段数据十六进制  :" + substring6);
                System.out.println("---------------------------------------------------------------------------------");

                /**********************
                 * 79-103
                 * 
                 * ******************************************/
                String substring4 = hexString.substring(79, 103);
                System.out.println("79-103频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring4));
                System.out.println("79-103频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring4));
                System.out.println("79-103频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring4));
                System.out.println("79-103频段数据GB2312:" + transcodingUtil.hexStringToString(substring4));
                System.out.println("79-103频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring4));
                System.out.println("79-103频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring4));
                System.out.println("79-103频段数据十进制      :" + transcodingUtil.transcoding(substring4));
                System.out.println("79-103频段数据十六进制  :" + substring4);
                System.out.println("---------------------------------------------------------------------------------");

                /*********
                 104-119
                 * ************************************************/
                String substring2 = hexString.substring(104, 155);
                // 月份
                String month = hexString.substring(108, 110);
                String transmonth = transcodingUtil.transcoding(month);
                // 日份
                String day = hexString.substring(110, 112);
                String transday = transcodingUtil.transcoding(day);
                // 时间
                String hour = hexString.substring(112, 114);
                String transhour = transcodingUtil.transcoding(hour);
                // 分钟
                String min = hexString.substring(114, 116);
                String transmin = transcodingUtil.transcoding(min);

                // 秒
                String sec = hexString.substring(116, 119);
                Integer transec = null;
                if (Integer.parseInt(transcodingUtil.transcoding(sec)) > 6) {

                    transec = Integer.parseInt(transcodingUtil.transcoding(sec)) - 6;
                    System.err.println("D" + transec);
                }
                else {

                    transec = Integer.parseInt(transcodingUtil.transcoding(sec));
                    System.err.println("X" + transec);
                }

                System.out.println("104-119频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring2));
                System.out.println("104-119频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring2));
                System.out.println("104-119频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring2));
                System.out.println("104-119频段数据GB2312:" + transcodingUtil.hexStringToString(substring2));
                System.out.println("104-119频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring2));
                System.out.println("104-119频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring2));
                System.out.println("104-119频段数据拼接后时间序列:" + transmonth + "-" + transday + " " + transhour + ":"
                                   + transmin + ":" + transec);
                System.out.println("104-119频段数据十进制      :" + transcodingUtil.transcoding(substring2));
                System.out.println("104-119频段数据—月份      :" + transmonth + "月");
                System.out.println("104-119频段数据—日期      :" + transday + "日");
                System.out.println("104-119频段数据—小时      :" + transhour + "时");
                System.out.println("104-119频段数据—分钟      :" + transmin + "分钟");
                System.out.println("104-119频段数据— 秒       :" + transec + "秒");
                System.out.println("当前时间戳:" + System.currentTimeMillis());
                System.out.println("104-119频段数据十六进制  :" + substring2);
                System.out.println("---------------------------------------------------------------------------------");

                /*********
                 120-197
                * ************************************************/

                String substring5 = hexString.substring(120, 197);

                System.out.println("120-197频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring5));
                System.out.println("120-197频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring5));
                System.out.println("120-197频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring5));
                System.out.println("120-197频段数据GB2312:" + transcodingUtil.hexStringToString(substring5));
                System.out.println("120-197频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring5));
                System.out.println("120-197频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring5));
                System.out.println("120-197频段数据十进制      :" + transcodingUtil.transcoding(substring5));
                System.out.println("120-197频段数据十六进制  :" + substring5);
                System.out.println("---------------------------------------------------------------------------------");

                /*********
                 198-220
                 * ************************************************/
                String substring3 = hexString.substring(198, 310);
                System.out.println("198-+频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring3));
                System.out.println("198-+频段数据GBK   :" + transcodingUtil.hexStringToStringGBK(substring3));
                System.out.println("198-+频段数据ISO   :" + transcodingUtil.hexStringToStringISO(substring3));
                System.out.println("198-+频段数据GB2312:" + transcodingUtil.hexStringToString(substring3));
                System.out.println("198-+频段数据BIG5  :" + transcodingUtil.hexStringToStringBIG(substring3));
                System.out.println("198-+频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring3));
                System.out.println("198-+频段数据十进制      :" + transcodingUtil.transcoding(substring3));
                System.out.println("198-+频段数据十六进制  :" + substring3);

                /*********
                                                  获取主机mac地址
                *************************************************/
                EthernetPacket datalink = (EthernetPacket)ip.datalink;
                StringBuffer srcMacStr = new StringBuffer();
                int count = 1;
                for (byte b : datalink.src_mac) {
                    String string = Integer.toHexString(b & 0xff);
                    if (string.length() == 1) {
                        string = "0" + string;
                    }
                    srcMacStr.append(string);
                    if (count++ != datalink.src_mac.length) srcMacStr.append(":");
                }
                System.out.println("获取主机mac地址为: " + srcMacStr);
                System.out.println("00:74:9c:e5:e0:01".equals(srcMacStr.toString()));

                /*********
                 *  数据汇总
                 *************************************************/
                
                
                
                String romateName ="3030315FB1A8BEAFD6F7BBFA";
                
                String transRomateName = transcodingUtil.hexStringToStringGBK(romateName);
                System.out.println(transRomateName);

                System.out.println("*************************数据汇总***************************************");

                System.out.println("数据包十六进制:" + hexString);
                System.out.println("数据包十六进制字符串数据包:" + hexStringToString);
                System.out.println("数据去向:" + ip.datalink);
                System.out.println("限制:" + ip.hop_limit);
                System.out.println("报文头十六进制:" + hexStringHead);
                System.out.println("报文头十进制:" + transcodingUtil.transcoding(hexStringHead));
                System.out.println("报文头十六进制字符串:" + StringHead);
                System.out.println("ip对象包:" + ip);
                /* System.err.println("报文头中时间戳序列 :"+transcodingUtil.stampToDate(ip.sec)); */
                /* System.out.println("ip对象包:"+ip.sec); */
                System.out.println("系统时间:" + new Date());
                
                f++ ;

                System.out.println("----------------------------本次抓取数据结束--累计" + f  + "---------------------------------------------------");
                System.out.println();

                /*********
                 *	将消息发送客户端汇总
                 *************************************************/
                Message message = new Message();
                message.setCurrentTime(new Date(System.currentTimeMillis()).toLocaleString());
                message.setEventDescription(transcodingUtil.hexStringToStringGBK(substring6).trim());
                message.setSystemCode(transcodingUtil.hexStringToStringGBK(substring));
                message.setEventId(UUID.randomUUID().toString());
                message.setSrcMac(srcMacStr.toString());
                
                ObjectMapper objectMapper = new ObjectMapper();
                String json = objectMapper.writeValueAsString(message);
                
                /*String test = transcodingUtil.hexStringToString(substring);*/
                ctx.writeAndFlush(Unpooled.wrappedBuffer(json.getBytes()));

            }
        }

    }

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

        cause.printStackTrace();

        ctx.close();

    }
}

4、消息实体 Message.java

package com.airtimes.netty.network.response;

public class Message {
    
    /**
     * 事件id
     */
    private String eventId;
    
    /**
     * src_mac
     */
    
    private String srcMac;
    
    /**
     * 系统码
     */
    private String systemCode;
    
    /**
     * 事件描述
     */
    private String eventDescription;
    
    /**
     * 子系統
     */
    private Integer masterArea;
    
    /**
     * 防区
     */
    private Integer slaverId;
    
    /**
     * 事件时间
     */
    private String currentTime;

    public String getEventId() {
        return eventId;
    }

    public void setEventId(String eventId) {
        this.eventId = eventId;
    }

    public String getSystemCode() {
        return systemCode;
    }

    public void setSystemCode(String systemCode) {
        this.systemCode = systemCode;
    }

    public String getEventDescription() {
        return eventDescription;
    }

    public void setEventDescription(String eventDescription) {
        this.eventDescription = eventDescription;
    }

    public Integer getMasterArea() {
        return masterArea;
    }

    public void setMasterArea(Integer masterArea) {
        this.masterArea = masterArea;
    }

    public Integer getSlaverId() {
        return slaverId;
    }

    public void setSlaverId(Integer slaverId) {
        this.slaverId = slaverId;
    }

    public String getCurrentTime() {
        return currentTime;
    }

    public void setCurrentTime(String currentTime) {
        this.currentTime = currentTime;
    }

    public String getSrcMac() {
        return srcMac;
    }

    public void setSrcMac(String srcMac) {
        this.srcMac = srcMac;
    }

    @Override
    public String toString() {
        return "Message [eventId=" + eventId + ", srcMac=" + srcMac + ", systemCode=" + systemCode
               + ", eventDescription=" + eventDescription + ", masterArea=" + masterArea + ", slaverId=" + slaverId
               + ", currentTime=" + currentTime + "]";
    }

    
}

5、工具类转换 TranscodingUtil .java 

package com.airtimes.netty.network.tools;


import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Date;


public class TranscodingUtil {

    /**
     * 接收的byte包转换成16进制字符串
     * 
     * @param req
     * @return
     */
    public static String toHexString(byte[] req) {
        // 进行编码转译 byte --> hexString (字母大写)
        String str = "";
        for (int i = 0; i < req.length; i++ ) {
            String hex = Integer.toHexString(req[i] & 0xFF);
            if (hex.length() == 1) {
                hex = "0" + hex;
            }
            str += hex.toUpperCase();
        }
        return str;
    }

    /**
     * 接收16进制字符串转换成10进制字符串
     * 
     * @param string
     * @return coding
     */
    public static String transcoding(String string) {

        // 传过来字符串的16进制字符个数
        int length = string.length() / 2;

        // 将字符串存进数组
        String[] s = new String[length];
        for (int i = 0; i < length; i++ ) {
            String ss = string.substring(i * 2, 2 + i * 2);
            s[i] = String.valueOf(ss);
        }

        // 定义接收转译之后的数组
        String[] str = new String[s.length];
        // 进行16进制向10进制转换
        for (int j = 0, k = s.length; j < k; j++ ) {
            str[j] = new BigInteger(s[j], 16).toString(10);
        }

        // 将转移后的数组转换为字符串
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length; i++ ) {
            sb.append(str[i]);
        }
        String coding = sb.toString();

        return coding;
    }

    /**
     * 16进制字符串转换为字符串
     *
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "GB2312");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String hexStringToStringUTF(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "utf-8");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String hexStringToStringGBK(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "gbk");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String hexStringToStringISO(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "GB18030");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String hexStringToStringBIG(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "big5");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String hexStringToStringUNICODE(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++ ) {
            try {
                baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "unicode");
            new String();
        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String[] bytesToHexStrings(byte[] src) {

        if (src == null || src.length <= 0) {

            return null;

        }

        String[] str = new String[src.length];

        for (int i = 0; i < src.length; i++ ) {

            String hex = Integer.toHexString(src[i] & 0xFF);
            if (hex.length() == 1) {

                hex = "0" + hex;
            }

            hex.join(",", str);

            /* string.Join(",", s); */
        }

        return str;

    }

    public static String toString(byte[] a) {
        if (a == null) return "null";
        int iMax = a.length - 1;
        if (iMax == -1) return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0;; i++ ) {
            b.append(a[i]);

            if (i == iMax) return b.append(']').toString();
            b.append(", ");
        }
    }

    /*
     * 将时间戳转换为时间
     */
    public static String stampToDate(Long s) {
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }

  public String convertByteBufToString(ByteBuf buf) {

        String str;

        if (buf.hasArray()) { // 处理堆缓冲区
            str = new String(buf.array(), buf.arrayOffset() + buf.readerIndex(), buf.readableBytes());
        }
        else { // 处理直接缓冲区以及复合缓冲区
            byte[] bytes = new byte[buf.readableBytes()];
            buf.getBytes(buf.readerIndex(), bytes);
            str = new String(bytes, 0, buf.readableBytes());
        }
        return str;
    }

    public String Object2Json(Object obj) {
        JSONObject json = JSONObject.fromObject(obj);// 将java对象转换为json对象
        String str = json.toString();// 将json对象转换为字符串

        return str;
    }

}

6、运行结果:服务器端启动后台效果

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第3张图片

 7、运行结果:客户端接收到服务器端报警信息

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第4张图片

 8、运行结果:服务器端启动后台效果Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第5张图片

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第6张图片

Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)_第7张图片

 本文主要是对防区红外线设备、的报警信息通过报警主机之间通信截获报警数据、数据类型、防区报警、以及报警级别数据、进行捕捉解析转发、使用Netty Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序、当有客户端请求连接时、客户端将会收到服务器广播的异常信息、文中主要是以Json字符串类型、

 

本文出自 “想学Python的Java程序猿” 博客,请务必保留此出处郑重声明转载请注明原地址、谢谢https://blog.csdn.net/qq_37606336/article/details/85045785

 

你可能感兴趣的:(网络数据包监听,netty,jpcap,wireshark,tcp,java)