`
yangyiqian
  • 浏览: 117335 次
  • 来自: ...
社区版块
存档分类
最新评论

Erlang与JAVA的交互操作

    博客分类:
  • JAVA
阅读更多
http://www.lupaworld.com/action-viewstutorial-itemid-10193.html
试了一下传说中的 JInterface ,使用 OtpErlang.jar 的整个过程其实非常简单,似乎比 JMS 的程序都简单。

首先,我们要用 java 实现的原始 erlang 程序如下,没错,就是巨简单的 echo ,我们的目标是要把它用 java 来改写,不仅写服务端,也要写客户端。
下载: echo_client.erl

   1. -module(echo_client).
   2. 
   3. -export([run/0]).
   4. 
   5. run() ->
   6.     Msg = "Hello Echo!",
   7.     {echo, abc@merlin} ! {self(), Msg},
   8.     io:format("send ~p ~n", [Msg]),
   9.     receive
  10.         Res ->
  11.             io:format("received ~p ~n", [Res])
  12.     end.

下载: echo_server.erl

   1. -module(echo_server).
   2. 
   3. -export([start/0]).
   4. 
   5. start() ->
   6.     register(echo, self()),
   7.     io:format("echo start~n", []),
   8.     loop().
   9. 
  10. loop() ->
  11.     receive
  12.         {Pid, Msg} ->
  13.             io:format("received ~p from ~p~n", [Msg, Pid]),
  14.             Pid ! Msg;
  15.         Any ->
  16.             io:format("received ~p ~n", [Any])
  17.     end,
  18.     loop().

写得并不严密,用了一堆硬编码,主要是个示例,就那么个意思,大家将就着看。

先说一下 JInterface 的一些基本概念。JInterface 的目的是:为 Java 提供一个包,使得 Java 程序在外部可以看起来就像一个标准的 Erlang Node 能以标准的 Erlang 方式与其他的节点进行通讯。它包装了 Erlang 节点之间分布式的通讯协议,编码解码,以及基本的 Erlang 操作,也就是 pid register send receive link unlink 等等,朴实无华。不过,作为两个语言之间的接口包,有了这些基本功能也就足够了。

根据 Erlang 的目录惯例, JInterface 的 Jar 在 ERLANG_HOME/lib/jinterface-x.x/priv 目录下,名字为 OtpErlang.jar 。注意,必须使用和你当前 Erlang 版本下的包,否则出了什么妖怪问题,别来问我,就算是问我,我也不知道该怎么办。:D 之前一直有一个误解,想当然的以为 JInterface 会用 JNI 什么的来实现,而自从碰过一次以后,对 JNI 这种“难以掌控”的东西总觉得有点畏难,所以,迟迟都没有动手,没想到,竟是纯 Java 实现的一个包。用起来方便,部署起来也漂亮。爽!

闲话休提,直接上代码得了。先是 Client 的代码。
下载: ErlangEchoClient.java

   1. package com.test.erlang;
   2. 
   3. import java.io.IOException;
   4. 
   5. import com.ericsson.otp.erlang.*;
   6. 
   7. public class ErlangEchoClient {
   8.   
   9.     public static void main(String[] args) throws IOException {
  10.       
  11.         String v = System.getProperties().getProperty("OtpConnection.trace");
  12.         System.out.println("OtpConnection.trace="+v);
  13.       
  14.         OtpNode self = new OtpNode("bcd", "123");
  15.       
  16.         System.out.println("node:"+self.node());
  17.         System.out.println("cookie:"+self.cookie());
  18.       
  19.         if (self.ping("abc", 2000)) {
  20.             System.out.println("remote is up");
  21.         } else {
  22.             System.out.println("remote is not up");
  23.             return;
  24.         }
  25.       
  26.         String text = "Hi there";
  27.       
  28.         OtpMbox mbox = self.createMbox();
  29.       
  30.         OtpErlangObject[] msg = new OtpErlangObject[2];
  31.         msg[0] = mbox.self();
  32.         msg[1] = new OtpErlangString(text);
  33.         OtpErlangTuple tuple = new OtpErlangTuple(msg);
  34. 
  35.         mbox.send("echo", "abc", tuple);
  36.       
  37.         System.out.println("send:"+text);
  38. 
  39.         try {
  40.           
  41.             OtpErlangObject reply = mbox.receive();
  42.           
  43.             System.out.println("receive[raw]:"+reply);
  44.           
  45.             if (reply instanceof OtpErlangString) {
  46.                 OtpErlangString text2 = (OtpErlangString) reply;
  47.               
  48.                 System.out.println("receive[text]:"+text2);
  49. 
  50.             }
  51.         } catch (Exception e) {
  52.             System.out.println("" + e);
  53.         }
  54.     }
  55. 
  56. }

下载: ErlangEchoServer.java

   1. package com.test.erlang;
   2. 
   3. import java.io.IOException;
   4. 
   5. import com.ericsson.otp.erlang.*;
   6. 
   7. public class ErlangEchoServer {
   8.   
   9.     public static void main(String[] args) throws IOException {
  10.       
  11.         String v = System.getProperties().getProperty("OtpConnection.trace");
  12.         System.out.println("OtpConnection.trace="+v);
  13.       
  14.         OtpNode self = new OtpNode("server1", "123");
  15.       
  16.         System.out.println("node:"+self.node());
  17.         System.out.println("cookie:"+self.cookie());
  18.       
  19.         OtpMbox mbox = self.createMbox("echo");
  20.       
  21.         String[] names = self.getNames();
  22.         for(int i=0; i<names.length; i++) System.out.println("name:"+names[i]);
  23.       
  24.         while (true) {
  25.             try {
  26.                 OtpErlangObject request = mbox.receive();
  27.               
  28.                 System.out.println("receive[raw]:"+request);
  29.               
  30.                 if (request instanceof OtpErlangTuple) {
  31.                     OtpErlangTuple t = (OtpErlangTuple) request;
  32.                     OtpErlangPid pid = (OtpErlangPid) (t.elementAt(0));
  33.                     OtpErlangString text = (OtpErlangString) (t.elementAt(1));
  34.                   
  35.                     System.out.println("receive[text]:"+text);
  36.                   
  37.                     OtpErlangString response = text;
  38.                   
  39.                     mbox.send(pid, response);
  40.                 }
  41.             } catch (Exception e) {
  42.                 System.out.println("" + e);
  43.             }
  44.         }
  45.     }
  46. 
  47. }

这里有几个需要提示的地方。

1. OtpErlang.jar 里面会访问系统变量 OtpConnection.trace 当它不为 0 时会显示链底层的 debug 信息。在调试时,这个设置就像照妖镜,有啥妖怪问题,都给照出来了。

2. setcookie 很重要。我这里是明确指定 123 作为 cookie ,如果这个 cookie 不匹配(比如,最好用: erl -setcookie 123 来启动)两端就死活也连不上,尤其是当你没有把上面的 trace 打开的时候,那你就去找去吧。

3. epmd 是 erlang 通讯机制的基础。也就是说,运行的时候,至少需要有一个 epmd 在运行(实际上也只会有一个)。比如说 java client 调用 erlang server ,erlang client 调 java server ,erlang client 调 erlang server 都很正常的不会有问题。而如果你要 java client 调 java server 的时候,最好先确认一下系统中有 epmd 正在运行。否则就会很邪。而启动一个 epmd 的超简单方法就是打开一个 erlang 的 console ,什么也不干都行。

扩充话提:Java Node 是 Hidden Node,一般启动的 Erlang 程序都运行在非 hidden node 模式下。具体 Hidden Node 的区别超出了本日志的范围,大家自己啃文档吧(其实是我也没看得很透彻,就不误导大家了,哈哈)。

再来个体外话,有了 JInterface 就等于在 Java 和 Erlang 的世界之间架起了一座桥梁。通过这个桥梁能干吗呢?这个问题留给你自己去想。

分享到:
评论

相关推荐

    erlang-java聊天

    【Erlang与Java交互实现聊天程序】 在IT领域,Erlang和Java都是重要的编程语言,各有其独特的优点和应用场景。本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的...

    erlang调用java

    首先,`Erlang`调用`Java`的主要工具是`Jinterface`,这是一个`Erlang`的标准库,它提供了与`Java`交互的接口。`Jinterface`允许`Erlang`进程和`Java`虚拟机(JVM)之间进行消息传递,实现跨语言的通信。 1. **设置...

    Erlang-or-java.rar_erlang

    5. **Erlang分布协议**:虽然Java本身不支持Erlang的分布协议,但有一些库如Jinterface允许Java程序与Erlang节点进行交互。Jinterface提供了Erlang term到Java对象的转换,并支持Erlang的分布式特性。 压缩包中的...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    三、Erlang与Java交互 1. 通信协议:由于Erlang和Java是不同的语言,它们之间的通信需要一个明确的协议。这可能是一个自定义的基于TCP/IP的协议,或者使用标准的协议如HTTP、WebSockets等。 2. Erlang-Java桥接库...

    c# 版ErlangOtp跨平台通信框架(Java版的转译)

    标题中的"C#版ErlangOtp跨平台通信框架(Java版的转译)"指的是一个用C#语言实现的框架,其目标是提供与Erlang OTP系统进行跨平台通信的能力。Erlang OTP(开放电信平台)是Erlang编程语言的一个核心组件,它包含了一...

    程序员开发erlang的资料

    2. **进程模型**:Erlang的进程与操作系统进程不同,它们轻量级且独立,可以高效地进行并发执行。每个进程有自己的内存空间,通过消息传递进行通信,这样的模型有利于构建分布式系统。 3. **错误处理和容错**:...

    基于erlang的文件存储

    本项目“基于Erlang的文件存储”就是这样一个尝试,它利用Erlang强大的并发处理能力和分布式特性,为服务端提供稳定的基础架构,而客户端则通过Java的Swing组件提供用户友好的交互界面。以下是对该项目中涉及的技术...

    适用于windows版本的 Erlang25.2.3 and RabbitMQ server 3.11.9下载

    对于Java开发者,可以通过使用`spring-amqp`或者`rabbitmq-java-client`库来与RabbitMQ交互,实现消息的生产与消费。同时,了解Erlang OTP的基本概念和RabbitMQ的工作原理,有助于更好地利用这两个工具解决实际问题...

    适用于windows版本的 Erlang24 and RabbitMQ server 3.8.16下载

    在Java环境中,RabbitMQ可以通过Java API(如RabbitMQ Java Client)进行集成,为Java开发者提供了与消息队列交互的便捷方式。 使用Erlang和RabbitMQ组合有以下关键知识点: 1. **Erlang并发模型**:Erlang采用轻...

    rabbitmq,erlang安装包

    6. **使用RabbitMQ**:了解基本的AMQP概念,如队列、交换机和绑定,然后通过各种编程语言的客户端库与RabbitMQ交互。例如,Python有pika库,Java有RabbitMQ Java Client,JavaScript有amqplib等。 在使用过程中,...

    安装Erlang所需包

    6. NCURSES库(用于Erlang的shell交互): ```bash sudo yum install -y ncurses-devel ``` 7. 可选:如果需要编译时支持Java,还需要JDK和Java开发库: ```bash sudo yum install -y java-1.8.0-openjdk-devel ```...

    processpuzzle-commons-domain-0.1.1-RELEASE.zip

    《gen_java:Erlang与Java交互的开源库解析》 在现代软件开发中,跨语言交互成为一种常态,尤其在分布式系统和并发处理领域,Erlang以其强大的并发能力和容错性受到青睐,而Java则以其丰富的库和成熟的生态系统广泛...

    erlang+android

    Erlang在Android上的应用可能需要一些特殊的工具或者库,如Erlang的Android绑定(如ErlyMobile或NIFs)来实现与Java代码的交互。 由于压缩包中只有一个名为"JSONTest"的文件,我们可以推断该文件可能是Erlang用于...

    erlang版本的protobuf(erl_protobuffs)

    3. **集成性**:由于Erlang主要用于构建分布式系统,`erl_protobuffs`的设计考虑到了Erlang的通信模型,使得与其他Erlang进程的交互更为流畅,尤其适合处理大规模并发场景下的数据交换。 **使用erl_protobuffs** 1...

    Erlang和RabbitMQ

    **Erlang与RabbitMQ详解** Erlang是一种由Ericsson公司开发的并发性、分布式和面向对象的编程语言,特别适用于构建高可靠性、容错性和可扩展性的系统。其设计灵感来源于函数式编程,使得Erlang在处理并发问题上表现...

    erlang程序设计中文版

    在本书的前言中,还提到了Erlang的年龄,它与Perl语言诞生的年份相近,比C++年轻,但比Java年长。尽管如此,Erlang的活跃度和影响力在一段时间里似乎并不像它的同辈语言那样广泛。然而,由于其语言设计上的一些特性...

    RabbitMQ+erlang安装包

    虽然RabbitMQ本身不直接支持JMS,但通过RabbitMQ的JMS客户端适配器,如rabbitmq-jms,可以让Java应用使用JMS API与RabbitMQ交互。这种方式可以让已使用JMS的Java应用轻松接入RabbitMQ,利用其强大的消息队列功能。 ...

    在erlang项目中使用protobuf例子

    6. **Erlang与protobuf的交互**:Erlang的并发和分布式特性使得protobuf成为实现高可用和高性能系统的一个理想选择。你可以使用protobuf在Erlang节点间交换消息,或者与其他支持protobuf的语言(如Java、Python等)...

    ERLang+RabbitMQ安装包.rar

    开发者可以根据需求选择合适的方式与RabbitMQ交互。基本的使用流程包括: 1. 生产者:创建一个连接到RabbitMQ服务器的客户端,发布消息到指定的交换机。 2. 交换机:根据预设的路由规则(如Direct、Topic、Fanout或...

Global site tag (gtag.js) - Google Analytics