本文详细介绍了SNMP4J服务器网络连接超时问题的解决方案。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值,有需要的朋友可以参考一下。
大家的网络安全管理中心作为管理方法中心,就是服务器!每个被管理的机器根据网络交换机作为客户端与网络管理员中心通信,使用TCP/IP协议!
SNMP协议书包只有一种,SNMP4J,作为SNMP应用的Java工具包,显示了其方便安全的工具包功能!
但是在应用中发现的一个难题是,服务器端和客户端推送信息时,多次推送后数据仍无法传输!网络也抓不到包,在追踪断点到SNMP4J的编码中发现了这么难的问题!
/** *SendsaSNMPmessagetothesuppliedaddress. * *@paramaddress *an<code>TcpAddress</code>.A *<code>ClassCastException</code>isthrownif *<code>address</code>isnota<code>TcpAddress</code> *instance. *@parammessage *byte[]themessagetosent. *@throwsIOException */ publicvoidsendMessage(Addressaddress,byte[]message) throwsjava.io.IOException{ if(server==null){ listen(); } serverThread.sendMessage(address,message); }我们可以看到,与UDP不同,它应用了一个服务项目流程!
publicvoidsendMessage(Addressaddress,byte[]message) throwsjava.io.IOException{ Sockets=null; SocketEntryentry=(SocketEntry)sockets.get(address); if(logger.isDebugEnabled()){ logger.debug("Lookingupconnectionfordestination'" address"'returned:"entry); logger.debug(sockets.toString()); } if(entry!=null){ s=entry.getSocket(); } if((s==null)||(s.isClosed())||(!s.isConnected())){ if(logger.isDebugEnabled()){ logger.debug("Socketforaddress'"address "'isclosed,openingit..."); } pending.remove(entry); SocketChannelsc=null; try{ //Openthechannel,setittonon-blocking,initiate //connect sc=SocketChannel.open(); sc.configureBlocking(false); sc .connect(newInetSocketAddress( ((TcpAddress)address).getInetAddress(), ((TcpAddress)address).getPort())); s=sc.socket(); entry=newSocketEntry((TcpAddress)address,s); entry.addMessage(message); sockets.put(address,entry); synchronized(pending){ pending.add(entry); } selector.wakeup(); logger.debug("Tryingtoconnectto"address); }catch(IOExceptioniox){ logger.error(iox); throwiox; } }else{ entry.addMessage(message); synchronized(pending){ pending.add(entry); } selector.wakeup(); } }他从一个Map中获取连接SocketEntry,然后获取连接目标Socket!
辨别插座是否合理。如果合理,马上推。如果无效,建立连接再推送!
然后我就找了这么一段代码。
privatesynchronizedvoidtimeoutSocket(SocketEntryentry){ if(connectionTimeout>0){ socketCleaner.schedule(newSocketTimeout(entry),connectionTimeout); } }换句话说,服务器会自己检查连接并消除它!
我尝试设置connectionTimeout的值。
privatevoidinit()throwsUnknownHostException,IOException{ threadPool=ThreadPool.create("Trap",2); dispatcher=newMultiThreadedMessageDispatcher(threadPool,newMessageDispatcherImpl()); //当地IP与监视端口号 listenAddress=GenericAddress.parse(System.getProperty("snmp4j.listenAddress","tcp:192.168.9.69/5055")); DefaultTcpTransportMappingtransport; transport=newDefaultTcpTransportMapping((TcpAddress)listenAddress); transport.setConnectionTimeout(0); snmp=newSnmp(dispatcher,transport); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv3()); USMusm=newUSM(SecurityProtocols.getInstance(),newOctetString(MPv3.createLocalEngineID()),0); SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); }引发一行代码设置DefaultTcpTransportMapping的请求超时时间为0!
那就没有问题了!
虽然问题暂时解决了,但是我怕问题可能不是这样的,因为我对SNMP4J还不够了解!
我也期待着将SNMP4J作为一个特殊的工具和服务器来应用。传输数据时有什么解决问题的方法?
文章里的内容就这些了。期待对大家的学习和培训有所帮助,也期待大家的应用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)