Java中的广播消息

Java中的广播消息,java,message,broadcast,corba,Java,Message,Broadcast,Corba,我需要一些机制,允许我在同一台电脑内从一个java程序向另一个java程序传输一些数据。我已经调查了RMI,但我希望第一个应用程序在没有第二个应用程序请求的情况下为第二个应用程序广播一些消息。在RMI中,只有客户端可以启动通信 原始插座也是不可取的(非常低的水平) 我需要类似RMI的东西,它具有不同的启动通信方案:1服务器为多个客户端广播消息,而不需要客户端的请求 你能给我推荐一些LIBS/Technologies(桌面应用程序)吗?可以是你正在搜索的,但是我只在C、C++和Python中使用它

我需要一些机制,允许我在同一台电脑内从一个java程序向另一个java程序传输一些数据。我已经调查了RMI,但我希望第一个应用程序在没有第二个应用程序请求的情况下为第二个应用程序广播一些消息。在RMI中,只有客户端可以启动通信

原始插座也是不可取的(非常低的水平)

我需要类似RMI的东西,它具有不同的启动通信方案:1服务器为多个客户端广播消息,而不需要客户端的请求

你能给我推荐一些LIBS/Technologies(桌面应用程序)吗?

可以是你正在搜索的,但是我只在C、C++和Python中使用它,所以我不完全知道它在java中有多好用。但是他们已经为他们的套接字实现了发布者订阅模式,至少Ubuntu 12.04下的3.2.2版本的静态库是稳定的,而且工作得很好。

可以是你正在搜索的,但是我只在C、C++和Python中使用它,所以我不完全知道它在java中有多好用。但是他们已经为他们的套接字实现了发布者-订阅者模式,并且至少ubuntu 12.04下版本3.2.2的静态库是稳定的,运行得非常好。

我建议您使用它的一个实现,例如

一个好的起点是。

我建议您使用它的一个实现,例如


一个好的起点是。

我建议使用带有触发器和存储过程的数据库。消息队列可以工作,但这是一个过于复杂的解决方案

如何创建过程并通过触发器调用它:

First, you add the following Java method to the class DBTrigger

CREATE OR REPLACE PROCEDURE add_emp (
  emp_no NUMBER, emp_name VARCHAR2, dept_name VARCHAR2)
AS LANGUAGE JAVA 
NAME 'DBTrigger.addEmp(int, java.lang.String, java.lang.String)';

Then, you create the INSTEAD OF trigger:

CREATE OR REPLACE TRIGGER emps_trig 
INSTEAD OF INSERT ON emps
FOR EACH ROW
CALL add_emp(:new.empno, :new.ename, :new.dname);

我建议使用带有触发器和存储过程的数据库。消息队列可以工作,但这是一个过于复杂的解决方案

如何创建过程并通过触发器调用它:

First, you add the following Java method to the class DBTrigger

CREATE OR REPLACE PROCEDURE add_emp (
  emp_no NUMBER, emp_name VARCHAR2, dept_name VARCHAR2)
AS LANGUAGE JAVA 
NAME 'DBTrigger.addEmp(int, java.lang.String, java.lang.String)';

Then, you create the INSTEAD OF trigger:

CREATE OR REPLACE TRIGGER emps_trig 
INSTEAD OF INSERT ON emps
FOR EACH ROW
CALL add_emp(:new.empno, :new.ename, :new.dname);
作为“快速修复”,将输出写入文件,并让第二个应用程序读取该文件

这一点都不优雅,但如果您对接口进行编码,您可以稍后用更好的实现替换该实现。

作为“快速修复”,将输出写入文件,并让第二个应用读取该文件


这一点都不优雅,但如果您对接口进行编码,您可以在以后用更好的实现来替换该实现。

一个好的解决方案是OMG数据分发标准(DDS)的实现。使用DDS,只有一个具有动态发现协议的全局数据空间。例如,有一个免费的社区版

一个好的解决方案是实施OMG数据分发标准(DDS)。使用DDS,只有一个具有动态发现协议的全局数据空间。例如,有一个免费的社区版

因为您用CORBA标记了它,所以可以使用向所有感兴趣的客户端广播通知。

因为您用CORBA标记了它,所以可以使用向所有感兴趣的客户端广播通知。

使服务器能够向客户端发送信息包。根据定义,数据报是“通过网络发送的独立、自包含的消息,其到达、到达时间和内容不受保证”。本质上,我们打开DatagramSocket是为了向客户端发送DatagramPack消息。我们使用数据报类(而不是标准套接字),因为它们允许我们向多个客户端广播信息,这些客户端都连接到一个多播套接字

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class MulticastSocketServer {

    final static String INET_ADDR = "224.0.0.3";
    final static int PORT = 8888;

    public static void main(String[] args) throws UnknownHostException, InterruptedException {
        // Get the address that we are going to connect to.
        InetAddress addr = InetAddress.getByName(INET_ADDR);

        // Open a new DatagramSocket, which will be used to send the data.
        try (DatagramSocket serverSocket = new DatagramSocket()) {
            for (int i = 0; i < 100; i++) {
                String msg = "Sent message no " + i;

                // Create a packet that will contain the data
                // (in the form of bytes) and send it.
                DatagramPacket msgPacket = new DatagramPacket(msg.getBytes(),
                        msg.getBytes().length, addr, PORT);
                serverSocket.send(msgPacket);

                System.out.println("Server sent packet with msg: " + msg);
                Thread.sleep(500);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

首先,我们启动客户端,它将一直等待传入的信息包。一旦我们启动服务器,它将发送信息包,客户端将接收信息包并在屏幕上打印信息,以使服务器能够向客户端发送信息包。根据定义,数据报是“通过网络发送的独立、自包含的消息,其到达、到达时间和内容不受保证”。本质上,我们打开DatagramSocket是为了向客户端发送DatagramPack消息。我们使用数据报类(而不是标准套接字),因为它们允许我们向多个客户端广播信息,这些客户端都连接到一个多播套接字

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class MulticastSocketServer {

    final static String INET_ADDR = "224.0.0.3";
    final static int PORT = 8888;

    public static void main(String[] args) throws UnknownHostException, InterruptedException {
        // Get the address that we are going to connect to.
        InetAddress addr = InetAddress.getByName(INET_ADDR);

        // Open a new DatagramSocket, which will be used to send the data.
        try (DatagramSocket serverSocket = new DatagramSocket()) {
            for (int i = 0; i < 100; i++) {
                String msg = "Sent message no " + i;

                // Create a packet that will contain the data
                // (in the form of bytes) and send it.
                DatagramPacket msgPacket = new DatagramPacket(msg.getBytes(),
                        msg.getBytes().length, addr, PORT);
                serverSocket.send(msgPacket);

                System.out.println("Server sent packet with msg: " + msg);
                Thread.sleep(500);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

首先,我们启动客户端,它将一直等待传入的信息包。一旦我们启动服务器,它将发送信息包,客户端将接收信息包,并在屏幕上打印信息

您能否提供一些关于系统必须执行的操作的更多信息,即,为什么要分离应用程序?可能重复的@Leon一个应用程序生成一些数据,用作另一个应用程序的输入。所有应用程序同时工作。我的第一个应用程序必须通知第二个应用程序数据准备就绪。每个应用程序也可以在没有其他应用程序的情况下使用-因此它们是分开的。为什么不尝试使用带有触发器和存储过程的共享数据库呢?为什么要使消息队列的事情复杂化?@tmporaries:在使用数据库时,您不必担心同步问题。只需从存储的进程调用接收应用程序的java方法。触发器将侦听数据准备就绪情况并调用存储的过程,存储的过程将调用java函数。您能否提供有关系统必须执行的操作的更多信息,例如,为什么将其分离?一个应用程序可能会产生@Leon的重复项。一个应用程序生成一些数据,用作另一个应用程序的输入。所有应用程序同时工作。我的第一个应用程序必须通知第二个应用程序数据准备就绪。每个应用程序也可以在没有其他应用程序的情况下使用-因此它们是分开的。为什么不尝试使用带有触发器和存储过程的共享数据库呢?为什么要使消息队列的事情复杂化?@tmporaries:在使用数据库时,您不必担心同步问题。只需从存储的进程调用接收应用程序的java方法。触发器将侦听数据准备情况并调用存储的proc,而存储的proc又将调用java函数。当然,这是一个简单的解决方案。但是我不能用