Node.js 用JAVA编写的服务如何与用C编写的zeromq代理通信

Node.js 用JAVA编写的服务如何与用C编写的zeromq代理通信,node.js,zeromq,jzmq,Node.js,Zeromq,Jzmq,我已经使用zeromq和C编程语言编写了一个请求-应答代理。代理将客户机请求路由到适当的服务,然后将回复路由回客户机。这些服务是用JAVA编写的 有人能解释一下如何让服务与代理进行通信吗。我确信这一定是一个常见的场景,但我没有太多的经验,所以请有人帮助我使我的代码具有可操作性 请假定服务将不支持zeromq。node.js是否在这种情况下使用?我需要编写http前端吗?这里有一种方法可以使用异步推/拉套接字来完成。我正在为这篇文章编写代码,所以请自己填写以下空白: 假设Java服务是POJO驻留

我已经使用zeromq和C编程语言编写了一个请求-应答代理。代理将客户机请求路由到适当的服务,然后将回复路由回客户机。这些服务是用JAVA编写的

有人能解释一下如何让服务与代理进行通信吗。我确信这一定是一个常见的场景,但我没有太多的经验,所以请有人帮助我使我的代码具有可操作性


请假定服务将不支持zeromq。node.js是否在这种情况下使用?我需要编写http前端吗?

这里有一种方法可以使用异步推/拉套接字来完成。我正在为这篇文章编写代码,所以请自己填写以下空白:

假设Java服务是POJO驻留在其自己的进程中,假设我们有一个没有zmq依赖项的简单服务:

public class MyJavaService{
   public Object invokeService(String params){
   }
}
现在,我们构建了一个Java委托层,它从代理中提取消息,将请求委托给Java服务方法,并在单独的套接字上返回响应:

//receive on this
Socket pull = ctx.createSocket(ZMQ.PULL)
pull.connect("tcp://localhost:5555")

//respond on this
Socket push = ctx.createSocket( ZMQ.PUSH)
psuch.connect("tcp://localhost:5556")

while( true){
  ZMsg msg = pull.recvMsg( pull)

  //assume the msg has 2 frames,
  //one for service to invoke,
  //the other with arguments
  String svcToInvoke = msg.popString()
  String svcArgs = msg.popString()

  if( "MyJavaService".equals(svcToInvoke)){
    ZMsg respMsg = new ZMsg()
    respMsg.push( (new MyJavaService()).invokeService( svcArgs))
    respMsg.send( push)
  }
 }

在代理端,只需创建推/拉套接字与java服务层通信(我不是C++程序员,所以请原谅)

使用PUSH/PULL对这种方法有效,但理想的方法是使用服务器上的路由器和客户机上的经销商进行完全异步通信,例如


希望有帮助

这些服务是Java,但它们也是ZeroMq客户机吗?他们可以使用来自基于C的ZeroMq代理的消息吗?客户端和服务将是不同的实体。它们还没有被编写出来,但会被编写出来(用JAVA)。为了进行测试,我用C编写了简单的客户端和服务。我的观点是,我不想让客户机和服务知道代理所理解的msg格式。他们可能应该使用JSON与代理通信。明白了,但是Java服务是ZeroMq客户端吗?我不确定,但我认为要求是他们不必担心ZeroMq。如果这是不可行的,假设java服务将使用ZrOMQ会有什么解决方案?如果java服务是ZrOMQ,那么解决方案很容易,因为ZrOMQ有C++和java语言绑定。您可以使用json作为中间的消息负载。java服务会驻留在C++应用程序中,还是在它们自己独立的进程中?
int main () {
    zmq::context_t context(1);

    zmq::socket_t push(context, ZMQ_PUSH);
    push.bind( "tcp://localhost:5555");

    // First allow 0MQ to set the identity
    zmq::socket_t pull(context, ZMQ_PULL);
    pull.bind( "tcp://localhost:5556");

    //code here to handle request/response,
    //to clients
    ..
}