2台Mac计算机与Erlang之间的通信
我遵循《编写Erlang-Joe Armstrong程序》一书,尝试在两台Mac电脑与Erlang之间建立通信(第14章):2台Mac计算机与Erlang之间的通信,erlang,Erlang,我遵循《编写Erlang-Joe Armstrong程序》一书,尝试在两台Mac电脑与Erlang之间建立通信(第14章): %文件:kvs.erl -模块(kvs)。 -导出([开始/0,存储/2,查找/1])。 start()->寄存器(kvs,spawn(fun()->loop()end))。 store(Key,Value)->rpc({store,Key,Value})。 查找(键)->rpc({lookup,Key})。 rpc(Q)-> kvs!{self(),Q}, 接收 {kv
%文件:kvs.erl
-模块(kvs)。
-导出([开始/0,存储/2,查找/1])。
start()->寄存器(kvs,spawn(fun()->loop()end))。
store(Key,Value)->rpc({store,Key,Value})。
查找(键)->rpc({lookup,Key})。
rpc(Q)->
kvs!{self(),Q},
接收
{kvs,回复}->
回复
终止
循环()->
接收
{From,{store,Key,Value}}->
put(键,{ok,Value}),
从…起{kvs,true},
loop();
{From,{lookup,Key}}->
从…起{kvs,get(Key)},
循环()
终止
设置Mac 1(Mac Pro)并运行Erlang服务器:
$ sudo hostname this.is.macpro.com
$ hostname
this.is.macpro.com
$ ipconfig getifaddr en2
aaa.bbb.ccc.209
$ erl -name server -setcookie abcxyz
(server@this.is.macpro.com)> c("kvs.erl").
{ok,kvs}
(server@this.is.macpro.com)> kvs:start().
true
(server@this.is.macpro.com)> kvs:store(hello, world).
true
(server@this.is.macpro.com)> kvs:lookup(hello).
{ok,world}
我尝试使用IP和主机名从另一个Mac创建RPC,但得到{badrpc,nodedown}
设置Mac 2(MacBook Pro)并尝试呼叫Mac 1:
$ sudo hostname this.is.macbookpro.com
$ hostname
this.is.macbookpro.com
$ ipconfig getifaddr en2
aaa.bbb.ccc.211 # different IP
$ erl -name client -setcookie abcxyz
% try using the hostname of Mac 1 but failed
(client@this.is.macbookpro.com)> rpc:call('server@this.is.macpro.com', kvs, lookup, [hello]).
{badrpc, nodedown}
% try using the IP address of Mac 1 but failed
(client@this.is.macbookpro.com)> rpc:call('server@aaa.bbb.ccc.209', kvs, lookup, [hello]).
{badrpc, nodedown}
如何设置我的Mac电脑并使其可用于Erlang的RCP?使用th
-name
时,应提供全名。您使用的语法用于-sname
。试试这个:
erl -name server@this.is.macpro.com -setcookie "abcxyz"
erl -name client@this.is.macbookpro.com -setcookie "abcxyz"
在这两种情况下,您还可以在@
之后指定IP
然后从一个节点连接到另一个节点:
net_kernel:connect_node('client@this.is.macbookpro.com').
这应该返回true
。如果返回false,则表示您未连接。您可以使用节点()。
(joe@teves-MacBook-Pro.local)3> net_kernel:connect_node('steve@Steves-MacBook-Pro.local').
true
(joe@teves-MacBook-Pro.local)4> nodes().
['steve@Steves-MacBook-Pro.local']
如果这不能解决问题,那么您可以检查两个系统上的epmd
,以确保它们都已注册
epmd -names