天天看點

SNMP4J開發trap監聽執行個體

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

import  org.snmp4j.CommandResponder;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.CommandResponderEvent;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.PDU;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.Snmp;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.TransportMapping;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.smi.UdpAddress;

SNMP4J開發trap監聽執行個體

import  org.snmp4j.transport.DefaultUdpTransportMapping;

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

public   class  TrapTest  ... {

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

    public static void main(String[] args)...{

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

        try ...{

SNMP4J開發trap監聽執行個體

            //snmp4j通過transportmapping的監聽端口接收SNMP資訊,是以這裡初始化一個

                //transportmapping,

SNMP4J開發trap監聽執行個體

            //注明本機的IP位址及接收trap的端口.

SNMP4J開發trap監聽執行個體

            TransportMapping transport = new DefaultUdpTransportMapping(new UdpAddress("127.0.0.1/162"));

SNMP4J開發trap監聽執行個體

            //建立一個處理消息的snmp執行個體

SNMP4J開發trap監聽執行個體

            Snmp snmp = new Snmp(transport);

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

            //CommandResponder是一個listener,用以處理擷取的trap消息

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

            CommandResponder trapPrinter = new CommandResponder()...{

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

                public synchronized void processPdu(CommandResponderEvent e)...{

SNMP4J開發trap監聽執行個體

                    PDU command = e.getPDU();

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

                    if(command!=null)...{

SNMP4J開發trap監聽執行個體

                        //這裡示例輸出trap的内容.具體的trap解析等工作在這裡進行.

SNMP4J開發trap監聽執行個體

                        System.out.println(command.toString());

SNMP4J開發trap監聽執行個體

                    }

SNMP4J開發trap監聽執行個體

                }

SNMP4J開發trap監聽執行個體

            };

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

            //在snmp執行個體中添加CommandResponder listener

SNMP4J開發trap監聽執行個體

            snmp.addCommandResponder(trapPrinter);

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

            System.out.println("start listening!");

SNMP4J開發trap監聽執行個體

            //開始啟動trap監聽.listen()方法内部啟動了一個線程,這個線程監聽發送到transport中定義的端口

                //的消息.

SNMP4J開發trap監聽執行個體

            transport.listen();

SNMP4J開發trap監聽執行個體

            System.out.println(transport.isListening());//測試監聽是否正常

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

            //等待一段測試時間,在這段時間可以發送trap資訊測試.

SNMP4J開發trap監聽執行個體

            Thread.sleep(180000);

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

        } catch (Exception e) ...{

SNMP4J開發trap監聽執行個體

            e.printStackTrace();

SNMP4J開發trap監聽執行個體

        }

SNMP4J開發trap監聽執行個體

    }

SNMP4J開發trap監聽執行個體

}

SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體
SNMP4J開發trap監聽執行個體

這裡有個問題,我沒有做測試:

在收到第一個trap資訊後處理該trap消息,如果不采用多線程處理該trap消息,将會導緻在trap處理時間内發送過來的另一個trap消無法接收而丢失.具體有無采用多線程處理可以通過測試得出.如果沒采用多線程處理,那麼有必要在processPdu方法中使用線程來處理該trap事件.