前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >erlang多node通信失败

erlang多node通信失败

作者头像
EltonZheng
发布2021-01-26 10:50:06
5400
发布2021-01-26 10:50:06
举报
文章被收录于专栏:Elton的技术分享博客

在测试在本机部署多个node,实现多个node间的rpc调用和通信。

假设服务器端的程序如下:

代码语言:javascript
复制
-module (kvs).
-export ([start/0,store/2,lookup/1]).

start() -> register(kvs, spawn(fun() -> loop() end)).

store(Key, Value) -> rpc({store, Key, Value}).

lookup(Key) -> rpc({lookup, Key}).

rpc(Q) ->
	kvs ! {self(), Q},
	receive
		{kvs, Reply} ->
			Reply
	end.

loop() ->
	receive
		{From, {store, Key, Value}} ->
			put(Key, {ok, Value}),
			From ! {kvs, true},
			loop();
		{From, {lookup, Key}} ->
			From ! {kvs, get(Key)},
			loop()
	end.

在终端中执行

代码语言:javascript
复制
$ erl -sname gandalf
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
(gandalf@EltonMacBookPro)1> kvs:start().
true

启动另外一个终端,执行

代码语言:javascript
复制
$ erl -sname bilbo
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
(bilbo@EltonMacBookPro)1> rpc:call(gandalf@EltonMacBookPro, kvs, store, [weather, fine]).
{badrpc,nodedown}

显示{badrpc,nodedown}。

测试

代码语言:javascript
复制
(bilbo@EltonMacBookPro)3> net_adm:ping(gandalf@EltonMacBookPro).
pang

显示pang,表示不通,通的话应该是pong

直接在shell中ping主机名,发现

代码语言:javascript
复制
$ ping EltonMacBookPro
PING eltonmacbookpro.home (180.168.41.175): 56 data bytes
64 bytes from 180.168.41.175: icmp_seq=0 ttl=248 time=14.337 ms
64 bytes from 180.168.41.175: icmp_seq=1 ttl=248 time=16.196 ms
64 bytes from 180.168.41.175: icmp_seq=2 ttl=248 time=12.764 ms

不是本地地址,是公网地址。 所以在/etc/hosts中指定一下主机名对应的ip 127.0.0.1。

之后就一切正常了

代码语言:javascript
复制
(bilbo@EltonMacBookPro)5> rpc:call(gandalf@EltonMacBookPro,kvs,store,[weather, fine]).
true
(bilbo@EltonMacBookPro)6> rpc:call(gandalf@EltonMacBookPro,kvs,lookup,[weather]).     
{ok,fine}

如果在本地局域网多台机器上部署对应node,则需要将局域网的机器名在hosts中都设置对应的ip地址。 比如A机器机器名是ubuntu,部署服务端。现在要用B(机器名EltonMacBookPro)来远超调用A的函数。 可以在B中的/etc/hosts设置A的机器名的ip地址。如

代码语言:javascript
复制
192.168.1.39 ubuntu

在A中运行

代码语言:javascript
复制
$ erl -sname gandalf -setcookie abc
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
(gandalf@ubuntu)1> kvs:start().
true

在B中运行

代码语言:javascript
复制
$ erl -sname bilbo -setcookie abc
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
(bilbo@EltonMacBookPro)1> rpc:call(gandalf@ubuntu,kvs,store,[weather,cold]).      
true
(bilbo@EltonMacBookPro)2> rpc:call(gandalf@ubuntu,kvs,lookup,[weather]).     
{ok,cold}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档