无法在Erlang中生成一个简单的服务器

时间:2010-06-28 08:02:27

标签: erlang

我有一个简单的服务器:

-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('server@myserver', fun simple_server:loop/0).

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

我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

  1. erl与模块源代码没有任何关系。请阅读erl -man erl了解详情。
  2. erlang:apply\2Node作为第一个参数,但Node应该存在且必须连接到当前节点。
  3. 你应该尝试:

    $ 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