`

erlang学习笔记(server/client通信)

 
阅读更多

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!").会有语法错,估计必须是通过主机名发起消息

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics