erlang实现跨节点(节点可位于不同的计算机上)发送消息非常简单,代码如下:
-module(test). -export([start/0,server/0,request/2]). handle(Reqdata) -> "Hello " ++ Reqdata. server() -> receive [From,{request,X}] -> io:format("Get ~p from client ~p!~n",[X,From]), Resp = handle(X), From ! {reply,Resp}, server() end. start() -> register(testserver,spawn(test,server,[])). request(To,Name) -> {testserver, To} ! [self(),{request,Name}], receive {reply,Res} -> io:format("Get ~p from ~p!~n",[Res,To]) after 5000 -> io:format("connect failed~n",[]) end.
1,将代码拷贝到两台主机上comA,comB上,其中comA为server端,comB为client端,这里需要确保comB配置好了comA的host
2,在comA和comB上创建~/.erlang.cookie,输入同样的内容
在服务器comA开启服务
comA:~/project # erl -sname hserver Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.9.3.1 (abort with ^G) (hserver@comA)1> c(test). {ok,test} (hserver@comA)2> test:start(). true Get "hello server!" from client <9327.39.0>! (hserver@comA)3>
在客户端comB发起消息
comB:~/project # erl -sname hclient Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.1 (abort with ^G) (hclient@comB)1> c(test). {ok,test} (hclient@comB)2> test:request(hserver@comA,"hello server!"). Get "Hello hello server!" from hserver@comA! ok
需要在comB的/ets/hosts中配置comB_ip comB
试了一下test:request(hserver@192.168.2.2,"hello server!").会有语法错,估计必须是通过主机名发起消息