2010-06-28 41 views
4

我有一个简单的服务器:不能产生一个简单的服务器在二郎山

-module(simple_server). 
-export([loop/0]). 

loop() -> 
    receive 
    {fact, N, Sender} -> 
     Sender ! {factResult, fact(N), self()}, 
     loop(); 
    {fib, N, Sender} -> 
     Sender ! {fibResult, fib(N), self()}, 
     loop(); 
    {stop, Sender} -> 
     Sender ! ok 
    end. 

fact(0) -> 1; 
fact(N) -> N * fact(N - 1). 

fib(N) -> fib(N, 1, 0). 

fib(0, _B, A) -> A; 
fib(N, B, A) -> fib(N-1, A+B, B). 

然后我得到这个:

...\code>erl simple_server.erl 

Eshell V5.7.5 (abort with ^G) 
1> Server = spawn('[email protected]', fun simple_server:loop/0). 

=ERROR REPORT==== 28-Jun-2010::10:46:29 === 
** Can not start erlang:apply,[#Fun<simple_server.loop.0>,[]] on [email protected]** 
<0.33.0> 

我错过了什么?

回答

3

它看起来不像您已经开始作为分布式节点。当我的shell erlang节点使用erl的“-sname”/“-name”标志启动时没有短名称/长名称时,我得到相同的错误消息。

如果您启动此shell以使其可以参与分发,则还必须确保simple_server的代码已在远程节点上加载,或者远程节点可以从其代码路径自动加载它。

对于交互式使用,可以使用shell中的nc(File)nl(Module)命令加载所有已知节点。如果节点erlang:nodes()未被列出,则使用net_adm:ping(Node)来ping节点。

+0

是的,我错过了'-sname'国旗,谢谢! – 2010-06-28 09:03:25

+0

对于'net_adm:ping/1'为+1 – 2012-11-12 00:25:53

1

您应该先阅读文档。一些教程将会有所帮助。

  1. erl与模块源代码没有任何关系。有关更多信息,请阅读erl -man erl
  2. 已将Node作为第一个参数,但Node应存在并且必须连接到当前节点。

你应该尝试:

$ erl 
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.7.5 (abort with ^G) 
1> c(simple_server). 
{ok, simple_serevr} 
2> spawn(simple_server, loop, []). 
<0.33.0> 
3> 

由于良好的出发点,你可以看看Learn You Some Erlang For Great Good