Java 如何保持SSH连接可用?
我正在编写一个应用程序,它使用sshj库进行SSH连接。用户从菜单打开“连接”对话框,键入登录数据并单击“连接”按钮以建立连接。然后,用户从不同的面板和框架执行各种操作。我的问题是:在用户单击“断开连接”按钮之前,我应该在何处保持此连接以使每个需要它的面板和框架都可以使用它?我曾在一些自定义类中考虑过静态字段,但我不相信这样做。你的想法是什么?放在哪里并不重要,只要你提供一个Java 如何保持SSH连接可用?,java,ssh,sshj,Java,Ssh,Sshj,我正在编写一个应用程序,它使用sshj库进行SSH连接。用户从菜单打开“连接”对话框,键入登录数据并单击“连接”按钮以建立连接。然后,用户从不同的面板和框架执行各种操作。我的问题是:在用户单击“断开连接”按钮之前,我应该在何处保持此连接以使每个需要它的面板和框架都可以使用它?我曾在一些自定义类中考虑过静态字段,但我不相信这样做。你的想法是什么?放在哪里并不重要,只要你提供一个getter方法来检索它,并且获取方法是public 我认为这更像是一个逻辑归属的问题。如果它是应用程序的属性(与窗口、框
getter
方法来检索它,并且获取方法是public
我认为这更像是一个逻辑归属的问题。如果它是应用程序的属性(与窗口、框架、概要文件等相反),则将getter放在主应用程序类中。听起来您对某种类型的池感兴趣 你可以用不同的方法来做。一种方法是让一个类处理所有连接,这是一个单例类。例如,您只需向池请求连接
SSHConnection con = ConnectionPool.getConnection(host, port);
您也可以为此使用代理。在代理中,您实际上得到的是占位符,而不是实际的连接。代理与其他实例共享信息,类似于
class ConnectionProxy {
private static SSHConnection connection;
}
连接变量是共享的,当您创建一个新的ConnectionProxy时,您实际上会得到一个旧的连接,但是看起来您得到了一个新的连接
另一种选择是简单地将实例传递给所有需要它的类。这将允许您跟踪谁在做什么,但您将失去从任何地方获得连接的灵活性
如果您正在调试,那么传递一个实例会有所帮助,请这样想。你在一个拥挤的房间里,你有一些钱放在一个需要钥匙才能打开的盒子里。如果你把钥匙交给一个人(需要钥匙的班级),然后离开房间回来,钱不见了,你可以责怪那个人。如果你只是把钥匙放在盒子旁边的桌子上(实例是全局的),然后离开房间,回来钱就不见了,那么祝你好运,找到谁拿走了它
参考文献:*]
代理示例 更具体地说,它可能看起来像这样:
public class ConnectionProxy implements Connectable {
// where Connectable is some shared interface between ConnectionProxy
// and SSHConnection. The proxy should "look like" a connection, it just
// hides the actual connection behind the scenes.
private static SSHConnection connection;
public ConnectionProxy() { }
public ConnectionProxy(String host, int port) {
connection = new SSHConnection(host, port);
}
public void connect(String host, int port) {
if (isConnected()) {
return;
}
connection = new SSHConnection(host, port);
}
public void reconnect() {
connection = new SSHConnection(connection.getHost(), connection.getPort());
}
public boolean isConnected() {
return connection != null && connection.isConnected();
}
}
您可以通过实例化或连接类来使用该类
class Program {
public void sendMessage() {
ConnectionProxy proxy = new ConnectionProxy();
if (!proxy.isConnected()) {
// I guess noone connected it
return;
}
proxy.sendBytes();
}
}
在连接对话框中,实例化或连接ConnectionProxy。您可以添加对多个连接的支持,即不同的主机和端口,只需将变量连接设置为列表,并检查主机和端口是否有正确的连接即可。您基本上创建了一个连接池,但对于客户端类来说,它似乎正在创建连接。从设计角度来看,我建议将您可以通过SSH执行的操作包装在一个单独的类中(
RemoteCommands
或类似的类),并注入(设置为属性)需要从中执行远程命令的任何位置都有此类的实例
如果这看起来像是很多额外的样板代码,因为每个框架和面板都需要它,那么这不应该对您说“我需要一个全局变量”。它应该说“我应该减少直接执行远程命令的组件的数量”。保持ssh连接处于活动状态与询问将连接实例存储在何处并不完全相同您使用的框架是什么?代理模式的使用如下:在用户单击connect之后,我创建SSHConnection类的实例,然后使用该实例在ConnectionProxy类中设置连接字段,对吗?然后,我在需要的地方创建ConnectionProxy的实例。当用户单击“断开连接”时,我关闭连接并将连接设置为null。@Radek:在我的帖子中添加了一个示例。