将文件数据传递给函数
Passing the file data into function
您好,我一直在尝试将文件中的 ipAdresses
传递给将执行 GET 操作的 SNMP 函数。我正在逐行读取文件并传递数据。但是我在 setAddress
处收到一个错误,如果我不从文件中传递,程序可以正常工作。看到代码第一行注释了ipAddress;
代码:
package com.snmp.discovery;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class Discover1 {
private static String port = "8001";
// OID of MIB CISCO-MGMT-MDM; Scalar Object = .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
private static String oidValue = ".1.3.6.1.2.1.1.5.0"; // ends with 0 for scalar object
private static int snmpVersion = SnmpConstants.version1;
private static String community = "public";
public static void main(String[] args) {
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("textfile.txt");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
Discover1.getDevice(strLine);
}
//Close the input stream
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
public static void getDevice(String a) throws Exception {
System.out.println("SNMP GET Demo");
System.out.println(a);
// Create TransportMapping and Listen
TransportMapping transport = new DefaultUdpTransportMapping();
transport.listen();
// Create Target Address object
CommunityTarget comtarget = new CommunityTarget();
comtarget.setCommunity(new OctetString(community));
comtarget.setVersion(snmpVersion);
comtarget.setAddress(new UdpAddress(a+"/"+port));
System.out.println("------------");
comtarget.setRetries(2);
comtarget.setTimeout(1000);
// Create the PDU object
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oidValue)));
pdu.setType(PDU.GET);
pdu.setRequestID(new Integer32(1));
// Create Snmp object for sending data to Agent
Snmp snmp = new Snmp(transport);
System.out.println("Sending Request to Agent...");
ResponseEvent response = snmp.get(pdu, comtarget);
if (response != null){
System.out.println("Got Response from Agent");
PDU responsePDU = response.getResponse();
if (responsePDU != null){
int errorStatus = responsePDU.getErrorStatus();
int errorIndex = responsePDU.getErrorIndex();
String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError){
System.out.println("Snmp Get Response = " + responsePDU.getVariableBindings());
} else {
System.out.println("Error: Request Failed");
System.out.println("Error Status = " + errorStatus);
System.out.println("Error Index = " + errorIndex);
System.out.println("Error Status Text = " + errorStatusText);
}
} else {
System.out.println("Error: Response PDU is null");
}
} else {
System.out.println("Error: Agent Timeout... ");
}
snmp.close();
}
}
从错误消息来看,您的文件中似乎有空格。当您直接传递 IP 地址时,没有空格,因此可以正常工作。使用前需要去掉空格。
更改下一行
Discover1.getDevice(strLine);
删除前导和尾随空格。喜欢:
选项 1:
Discover1.getDevice(strLine.trim());
选项 2:
Discover1.getDevice(StringUtils.trim(strLine));
参考:StringUtils
所以这可能不是一个确切的答案,但它不适合放在评论中。
这很糟糕:
catch(Exception e) { .... }
仅当其他人的方法throws Exception
时才这样做。另外,如果可以的话,打那个人。
你自己的方法不应该methodName() throws Exception
。它应该具体 methodName () throws IOException
等
你应该做 catch(IOException e) { ... } catch(IllegalArgumentException e) {...}
等等
如您所见,如果您不知道抛出的异常类型,则很难进行故障排除。
最后,在请求有关异常的帮助时,通常应该包括堆栈跟踪。例如:
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
此信息有助于调试。
您好,我一直在尝试将文件中的 ipAdresses
传递给将执行 GET 操作的 SNMP 函数。我正在逐行读取文件并传递数据。但是我在 setAddress
处收到一个错误,如果我不从文件中传递,程序可以正常工作。看到代码第一行注释了ipAddress;
代码:
package com.snmp.discovery;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class Discover1 {
private static String port = "8001";
// OID of MIB CISCO-MGMT-MDM; Scalar Object = .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
private static String oidValue = ".1.3.6.1.2.1.1.5.0"; // ends with 0 for scalar object
private static int snmpVersion = SnmpConstants.version1;
private static String community = "public";
public static void main(String[] args) {
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("textfile.txt");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
Discover1.getDevice(strLine);
}
//Close the input stream
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
public static void getDevice(String a) throws Exception {
System.out.println("SNMP GET Demo");
System.out.println(a);
// Create TransportMapping and Listen
TransportMapping transport = new DefaultUdpTransportMapping();
transport.listen();
// Create Target Address object
CommunityTarget comtarget = new CommunityTarget();
comtarget.setCommunity(new OctetString(community));
comtarget.setVersion(snmpVersion);
comtarget.setAddress(new UdpAddress(a+"/"+port));
System.out.println("------------");
comtarget.setRetries(2);
comtarget.setTimeout(1000);
// Create the PDU object
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oidValue)));
pdu.setType(PDU.GET);
pdu.setRequestID(new Integer32(1));
// Create Snmp object for sending data to Agent
Snmp snmp = new Snmp(transport);
System.out.println("Sending Request to Agent...");
ResponseEvent response = snmp.get(pdu, comtarget);
if (response != null){
System.out.println("Got Response from Agent");
PDU responsePDU = response.getResponse();
if (responsePDU != null){
int errorStatus = responsePDU.getErrorStatus();
int errorIndex = responsePDU.getErrorIndex();
String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError){
System.out.println("Snmp Get Response = " + responsePDU.getVariableBindings());
} else {
System.out.println("Error: Request Failed");
System.out.println("Error Status = " + errorStatus);
System.out.println("Error Index = " + errorIndex);
System.out.println("Error Status Text = " + errorStatusText);
}
} else {
System.out.println("Error: Response PDU is null");
}
} else {
System.out.println("Error: Agent Timeout... ");
}
snmp.close();
}
}
从错误消息来看,您的文件中似乎有空格。当您直接传递 IP 地址时,没有空格,因此可以正常工作。使用前需要去掉空格。
更改下一行
Discover1.getDevice(strLine);
删除前导和尾随空格。喜欢:
选项 1:
Discover1.getDevice(strLine.trim());
选项 2:
Discover1.getDevice(StringUtils.trim(strLine));
参考:StringUtils
所以这可能不是一个确切的答案,但它不适合放在评论中。
这很糟糕:
catch(Exception e) { .... }
仅当其他人的方法throws Exception
时才这样做。另外,如果可以的话,打那个人。
你自己的方法不应该methodName() throws Exception
。它应该具体 methodName () throws IOException
等
你应该做 catch(IOException e) { ... } catch(IllegalArgumentException e) {...}
等等
如您所见,如果您不知道抛出的异常类型,则很难进行故障排除。
最后,在请求有关异常的帮助时,通常应该包括堆栈跟踪。例如:
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
此信息有助于调试。