我在一个支持全国网络上许多不同站点的大型组织工作。我们的供应商为我们在每个站点使用的硬件提供诊断工具。可以通过Telnet访问诊断和报告。
问题是我们想要同时监控所有网站,目前我们只能一次检查一个(通过telnet)。
我已经构建了一些将使用Runtime.exec(String)
向每个IP地址发送ping命令的内容。但现在我希望能够使用供应商的诊断和报告工具自动发送特定命令。有关最佳方法的任何想法吗?注意我们有一个混合系统 - 一些站点在防火墙后面,有些则没有。一个完整的解决方案将是理想的,但我也会满足于部分解决方案。
是否可以像获取Runtime.exec(String)
返回的Process对象的输入和输出流一样简单,并将我的命令发送到输入并读取输出上的响应?或者我应该连接到端口23(通常的telnet端口),然后表现为任何其他客户端 - 服务器系统。或者其他完全不同的东西?
我正在继续尝试,只是集思广益......
代码:(删除敏感信息)
void exec(String ip)
{
Socket sock = null;
BufferedReader br = null;
PrintWriter pw = null;
try
{
sock = new Socket(ip, 23);
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
pw = new PrintWriter(sock.getOutputStream());
this.read(br);
System.out.println("Sending username");
pw.println("username");
this.read(br); // Always blocks here
System.out.println("Sending password");
pw.println("password");
this.read(br);
pw.close();
br.close();
sock.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
void read(BufferedReader br) throws IOException
{
char[] ca = new char[1024];
int rc = br.read(ca);
String s = new String(ca).trim();
Arrays.fill(ca, (char)0);
System.out.println("RC=" + rc + ":" + s);
//String s = br.readLine();
//
//while(s != null)
//{
// if(s.equalsIgnoreCase("username:"))
// break;
//
// s = br.readLine();
//
// System.out.println(s);
//}
答案 0 :(得分:23)
为什么不简单地使用Socket系统?
在端口23上打开所选服务器的套接字并从此处发送您自己的命令。
这是一个简单的例子:
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket pingSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
pingSocket = new Socket("servername", 23);
out = new PrintWriter(pingSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(pingSocket.getInputStream()));
} catch (IOException e) {
return;
}
out.println("ping");
System.out.println(in.readLine());
out.close();
in.close();
pingSocket.close();
}
}
资源:
答案 1 :(得分:1)
在套接字级别执行此操作的问题是,当您只想执行一些telnet命令时,您突然需要成为协议专家。
我在de.mud.jta上面写了一个驱动程序,但是它让线程保持打开状态,我不知道在哪里,以及如何修复它们。在我看来,除了协议级别的编码或旧的JTA之外,必须有更好的东西。
答案 2 :(得分:0)
telnet 几乎裸tcp。你可以建立套接字连接,编写命令,读取响应。
好 - telnet确实有一些可以与数据流混合的控制命令。你可以编程忽略它们。或者,要完全识别协议,请使用java telnet客户端软件包。
答案 3 :(得分:0)
答案 4 :(得分:0)
尝试检查Netty Java Library。他们有一套很好的Telnet,SSH和其他非常有用的网络库