2010-06-28 103 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