我已经在windows上运行了Gui应用程序,并且我想连接到远程unix机器并在那里执行类似API的操作,浏览机器中的日志文件并发送回应用程序最后一个日志文件或我想要在远程机器上执行的其他API。使用java的两台机器之间的通信
在远程机器上,我没有应用程序服务器,只是安装了Java的应用程序服务器。
我想使用Java为了在远程机器上执行远程API;
什么是建议,我可以使用网络服务,任何人都可以请指教。
在此先感谢。
我已经在windows上运行了Gui应用程序,并且我想连接到远程unix机器并在那里执行类似API的操作,浏览机器中的日志文件并发送回应用程序最后一个日志文件或我想要在远程机器上执行的其他API。使用java的两台机器之间的通信
在远程机器上,我没有应用程序服务器,只是安装了Java的应用程序服务器。
我想使用Java为了在远程机器上执行远程API;
什么是建议,我可以使用网络服务,任何人都可以请指教。
在此先感谢。
如果Java可以执行您正在讨论的操作,我将使用Sockets与UNIX-Machine(通过TCP/IP)进行通信。
您的Windows PC将是客户端发送命令到Unix-PC。
Web服务可能会有点笨重的选择,尤其是如果你选择SOAP的话。如果客户端和服务器始终是Java,那么RMI似乎是最简单的解决方案,因为它使用普通的方法调用机制在两个不同的JVM之间进行通信(还有一些额外的接口和规则要遵循取悦RMI规范)。
对于分析远程机器的日志文件,您总是可以使用Apache Commons sftp以编程方式将远程日志文件的副本FTP传输到您的PC。
如果您将日志文件配置为可旋转或每次达到特定大小时进行旋转,则可以避免一遍又一遍地重新载入相同的信息。
Spring框架附带一些remoting options,这些都很容易设置。您可以使用它们的类来更简单地配置诸如RMI或JMS之类的标准,或者使用轻量级Web服务协议,例如Spring的HTTP调用者或Hessian。
您可以使用Ganymed SSH-2 for Java从客户端Java应用程序ssh到远程主机并运行命令。无需在远程服务器上运行任何其他组件。您可以执行基于密码的身份验证或基于密钥的身份验证来登录远程主机。我们成功地使用它来管理在远程UNIX主机上运行的应用程序(启动/停止/ grep日志文件等)。您可以使用包中提供的StreamGobbler类来捕获远程命令的输出。您可以在一次远程调用中传递以分号分隔的多个命令。
基本示例包中包含:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class Basic
{
public static void main(String[] args)
{
String hostname = "127.0.0.1";
String username = "joe";
String password = "joespass";
try
{
/* Create a connection instance */
Connection conn = new Connection(hostname);
/* Now connect */
conn.connect();
/* Authenticate.
* If you get an IOException saying something like
* "Authentication method password not supported by the server at this stage."
* then please check the FAQ.
*/
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
if (isAuthenticated == false)
throw new IOException("Authentication failed.");
/* Create a session */
Session sess = conn.openSession();
sess.execCommand("uname -a && date && uptime && who");
System.out.println("Here is some information about the remote host:");
/*
* This basic example does not handle stderr, which is sometimes dangerous
* (please read the FAQ).
*/
InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while (true)
{
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
/* Show exit status, if available (otherwise "null") */
System.out.println("ExitCode: " + sess.getExitStatus());
/* Close this session */
sess.close();
/* Close the connection */
conn.close();
}
catch (IOException e)
{
e.printStackTrace(System.err);
System.exit(2);
}
}
}
感谢您的回复, 目前我正在使用Ganymed SSH来做到这一点,为此,我一直必须发送请求作为unix命令,如 sess.execCommand(“uname -a && date && uptime &&谁“) 如果我想在java代码中使用重逻辑并在java中使用线程,那么它的问题 – john
+1:除非你一个很好的理由,否则做,我会用一个基于文本的协议,这样你就可以轻松登录并阅读正在发送/收到什么。 –