为了简单起见,为什么不使用普通的TCP套接字呢?
他们每个人都可以听一听 Socket 。 本教程 入门很好。
Socket
看一下 JavaGroups ,它将解决您的通信问题,并帮助您检测其他应用程序是否正在运行。如果应用程序没有运行,则必须使用java.lang.Runtime.exec()为它启动新的JVM ...
“企业”的方法是在Java EE服务器中运行这些应用程序,或者至少在Spring框架中运行这些应用程序。它也可能非常矫枉过正。
如果需要传递大量数据,那么RMI就会这样做。
如果您不害怕破解自己的协议,数据结构和错误处理,您可以设置服务器和客户端套接字并通过这些套接字进行通信。
我认为对于通过公共目录中的文件进行通信(建立自己的编写或删除文件的协议)或通过共享数据库进行通信的替代方案有一定的吸引力。低技术,不是非常快,但非常简单和可靠。而且从外部监控“通信”相当容易。
我第二次Socket通信和RMI。 RMI更复杂,但对程序员来说更直观。这取决于您发送的信息类型。将原始字节推送到另一台机器可能比运行RMI服务器和处理所有爵士乐更有意义......
为了说明让两个应用程序相互通信是多么容易,请使用JGroups查看此网络剪贴板演示。只需启动两个实例并开始将文件放入其中一个实例中。第二个实例将立即显示相同的文件。
import java.io.Serializable; import java.awt.*; import java.awt.datatransfer.*; import javax.swing.*; import org.jgroups.*; public class JGroupsTest { public static void main(String[] args) throws Exception { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setSize(500, 300); final DefaultListModel listModel = new DefaultListModel(); final JList panel = new JList(listModel); panel.setBackground(new Color(128, 0, 40)); panel.setForeground(new Color(240, 240, 240)); frame.add(panel); System.setProperty("java.net.preferIPv4Stack", "true"); final JChannel channel = new JChannel("udp.xml"); channel.connect("networkclipboard"); channel.setReceiver(new ReceiverAdapter() { @Override public void viewAccepted(View newView) { frame.setTitle("Network Clipboard - " + channel.getLocalAddress()); } @Override public void receive(Message msg) { listModel.addElement(msg.getObject()); } }); panel.setTransferHandler(new TransferHandler() { @Override public boolean importData(JComponent comp, Transferable t) { DataFlavor[] transferDataFlavors = t.getTransferDataFlavors(); for (DataFlavor flavor : transferDataFlavors) { try { Object data = t.getTransferData(flavor); if (data instanceof Serializable) { Serializable serializable = (Serializable) data; Message msg = new Message(); msg.setObject(serializable); channel.send(msg); } } catch (Exception e) { e.printStackTrace(); } } return super.importData(comp, t); } @Override public boolean canImport(TransferSupport support) { return true; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { return true; } }); } }
尝试与SocketCommunication通信,即使应用程序在同一台机器上。
在这里可以找到更多信息 怎么做 (Sun / Java文档)。
根据您正在寻找的通信方式(高延迟,大量数据等)以及该系统是否可以扩展到仅仅2个Java系统,可能是使用中间件解决方案(如Tibco)的消息传递系统的SmartSockets。
有关您的设置和期望的任何更多信息将有所帮助。
这取决于您希望如何传达这两个程序:
如果只需要进程间信号量,请在/ tmp中的某个位置创建一个文件并将其锁定。
如果只需要进程间同步消息传递(远程过程调用),则RMI应该是最简单的。
如果需要异步进程间消息传递,JMS应该是最简单的。
如果需要进程间共享内存,请使用映射文件。
如果您需要以上所有内容,Terracotta(http://www.terracotta.org/)是最简单的方法:在相同甚至不同计算机上的不同JVM上的Java程序看到彼此就好像它们是在一个JVM中执行的机。将一个程序拆分成几个甚至不需要任何代码更改 - 这足以编写XML配置文件。
您还应该考虑好的经典RMI。
这取决于您希望在两个应用程序之间进行何种通信。例如,如果您使用套接字或RMI,则两个应用程序都需要启动才能进行通信。如果您想要进行的通信类型可以更加异步,那么您可以使用更多基于消息传递的方法。
例如,ZooKeeper允许您在非常简单但功能强大的原语之上实现您想要的任何内容。这一页 ( http://hadoop.apache.org/zookeeper/docs/current/recipes.html )解释了如何使用ZooKeeper构建更高级别的构造。
缺点是你需要另一个系统。例如,如果您使用JGroups,则不会。
希望这可以帮助