Java中的广播消息

时间:2014-04-22 06:05:02

标签: java message broadcast corba

我需要一些机制,允许我将一些数据从一个java程序传输到同一台PC中的另一个程序。我已经调查了RMI,但我希望第一个应用程序在没有第二个应用程序请求的情况下广播第二个消息。在RMI中,只有客户端才能发起通信。

原始套接字也不可取(非常低级别)。

我需要像RMI这样的东西,使用不同的启动通信方案:1台服务器在没有客户请求的情况下为多个客户端广播消息。

您能否建议我使用一些libs /技术(桌面应用程序)?

7 个答案:

答案 0 :(得分:2)

我建议你使用java messaging service及其中一个实现,例如ApacheMQ

一个很好的起点是here

答案 1 :(得分:1)

我建议使用带触发器和存储过程的数据库。 Here is an example of calling java methods from the database。消息队列将起作用,但这是一个过于复杂的解决方案。

Here's an excerpt from an example如何创建一个过程并通过触发器调用它:

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);

答案 2 :(得分:1)

由于您使用CORBA对此进行了标记,因此您可以使用Event Service向所有感兴趣的客户广播通知。

答案 3 :(得分:1)

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

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();
        }
    }
}

我们需要考虑的一件事是,有一些特定的地址允许我们使用MulticastSocket是有限的,特别是在224.0.0.0到239.255.255.255的范围内。其中一些是保留的,如224.0.0.0。我们使用的地址224.0.0.3可以安全使用。

关于客户,我们将采取不同的措施。我们将创建一个客户端类,它将接受来自服务器的传入消息,然后我们将复制此类。这里的要点是,通过使用相同的代码,我们可以无缝连接到服务器,同时拥有尽可能多的客户端。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
public class MulticastSocketClient 
{

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

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

        // Create a buffer of bytes, which will be used to store
        // the incoming bytes containing the information from the server.
        // Since the message is small here, 256 bytes should be enough.
        byte[] buf = new byte[256];

        // Create a new Multicast socket (that will allow other sockets/programs
        // to join it as well.
        try (MulticastSocket clientSocket = new MulticastSocket(PORT)){
            //Joint the Multicast group.
            clientSocket.joinGroup(address);

            while (true) {
                // Receive the information and print it.
                DatagramPacket msgPacket = new DatagramPacket(buf, buf.length);
                clientSocket.receive(msgPacket);

                String msg = new String(buf, 0, buf.length);
                System.out.println("Socket 1 received msg: " + msg);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

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

答案 4 :(得分:0)

ZeroMQ可能是您正在搜索的内容,但我只在C,C ++和Python中使用它,所以我不完全确定它在Java中的可用性。但是他们已经为他们的套接字实现了Publisher-Subscriber模式,并且至少ubuntu 12.04下的3.2.2版本的静态库是稳定的并且运行良好。

答案 5 :(得分:0)

作为&#34;快速修复&#34;将输出写入文件,让第二个应用程序读取文件。

这根本不优雅,但是如果您编写接口代码,以后可以用更好的方法替换实现。

答案 6 :(得分:0)

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