我正在编写一个虚拟网络。
我有一个中央客户端类,它实现了我的整个网络,并允许向/从网络中的特定其他客户端发送/接收数据。我现在不想对使用网络的所有程序使用 Client 类的单个实例。我有一个程序接口来处理传入的数据包,还有一个用于发送的包装器,所以我会欣赏另一种解决方案,而不是“运行本地 TCP 服务器”。
我现在的问题是:如何让一个类的单个实例为所有在 Java 中使用它的程序运行?
我正在编写一个虚拟网络。
我有一个中央客户端类,它实现了我的整个网络,并允许向/从网络中的特定其他客户端发送/接收数据。我现在不想对使用网络的所有程序使用 Client 类的单个实例。我有一个程序接口来处理传入的数据包,还有一个用于发送的包装器,所以我会欣赏另一种解决方案,而不是“运行本地 TCP 服务器”。
我现在的问题是:如何让一个类的单个实例为所有在 Java 中使用它的程序运行?
这可以通过使用 Java 中可用的 RMI、RMI-IIOP 或 CORBA 功能轻松完成。提到的技术允许在单台机器(服务器)上创建一个对象实例,并将其作为远程接口导出到其他计算机(你说你需要网络)。在其他主机中,您将拥有一个与您的“真实”实例实现的接口相同的存根类,并且能够在其上调用方法。这些调用最终将在您的服务人员的单个实例上远程调用。可能会认为,这正是您所要求的。
从更新、更有趣的方法来看,Google Protocol Buffers 看起来不错,而您需要更多使用 Protocol Buffers 的自定义代码。Web 服务还允许导出接口并且更适合通过防火墙(此处列出的其他方法更适合在您自己的服务器之间进行通信,您可以配置您想要的方式)。
如果您需要确保您的程序只有一个实例在给定的操作系统上运行,可以按照此问题中的讨论来完成。如果您的程序正在侦听固定端口,则第二个实例可能无论如何都无法正常启动,因为这些端口已经被占用;您只需要在尝试绑定 socked 并终止时捕获异常。