首页 > 代码库 > erlang分布式入门(一)-ping pong

erlang分布式入门(一)-ping pong

erlang分布式入门(一)-ping pong

测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192.168.0.183(centos-183),

1.按照上面链接(步骤1-4)设置通过ssh hostname 免输入密码直接登录。

 

2.设置erlang的magiccookie,由于都是以root账号操作,分别在两台机子上执行以下命令

cd /root

vi .erlang.cookie 

输入

Shell代码  技术分享
  1. centos_erlang  

:wq 退出保存

chmod 400 .erlang.cookie,linux下需要用户对magiccookie有读权限

 

3.启动epmd进程,它负责映射符号名到机器地址在两个机器都执行:epmd -daemon

 

4.ping-pong测试代码,来源自网上erlang教程,tut17.erl

Erlang代码  技术分享
  1. -module(tut17).  
  2.   
  3. -export([start_ping/1, start_pong/0,  ping/2, pong/0]).  
  4.   
  5. ping(0, Pong_Node) ->  
  6.     {pong, Pong_Node} ! finished,  
  7.     io:format("ping finished~n", []);  
  8.   
  9. ping(N, Pong_Node) ->  
  10.     {pong, Pong_Node} ! {ping, self()},  
  11.     receive  
  12.         pong ->  
  13.             io:format("Ping received pong~n", [])  
  14.     end,  
  15.     ping(N - 1, Pong_Node).  
  16.   
  17. pong() ->  
  18.     receive  
  19.         finished ->  
  20.             io:format("Pong finished~n", []);  
  21.         {ping, Ping_PID} ->  
  22.             io:format("Pong received ping~n", []),  
  23.             Ping_PID ! pong,  
  24.             pong()  
  25.     end.  
  26.   
  27. start_pong() ->  
  28.     register(pong, spawn(tut17, pong, [])).  
  29.   
  30. start_ping(Pong_Node) ->  
  31.     spawn(tut17, ping, [3, Pong_Node]).  

 

5.在centos-183上执行erl -sname ‘pong‘ ,启动pong节点,进入erl命令行之后输入 tut17:start_pong().

在centos-182上执行 erl -sname ‘ping‘,启动ping节点,进入erl命令行之后输入 tut17:start_ping(‘pong@centos-183‘).

 

命令及输出见下图:


技术分享
 
技术分享

 

 

注意在ping节点上的erl命令行启动ping进程的时候如果输入tut17:start_ping(pong@centos-183). 会报错如下:

Shell代码  技术分享
  1. ** exception error: bad argument in an arithmetic expression  
  2.      in operator  -/2  
  3.         called as pong@centos - 183  

 

在参考“庄周梦蝶”的http://www.blogjava.net/killme2008/archive/2007/06/15/124547.html 时就出现这个错误,后来在stackoverflow 上找到一个相关问题 http://stackoverflow.com/questions/413736/naming-nodes-in-erlang 才得以解决!

erlang分布式入门(一)-ping pong