Erlang简单的服务器问题

时间:2010-07-17 23:15:02

标签: erlang

当我学习Erlang时,我正试图解决前任问题。 4.1(“回声服务器”)来自“Erlang编程”一书(由O'Reilly撰写),我遇到了问题。 我的代码看起来像这样:

-module(echo).
-export([start/0, print/1, stop/0, loop/0]).

start() ->
    register(echo, spawn(?MODULE, loop, [])),
    io:format("Server is ready.~n").

loop() ->
    receive
        {print, Msg} ->
            io:format("You sent a message: ~w.~n", [Msg]),
            start();
        stop ->
            io:format("Server is off.~n");
        _ ->
            io:format("Unidentified command.~n"),
            loop()
    end.

print(Msg) -> ?MODULE ! {print, Msg}.

stop() -> ?MODULE ! stop.

不幸的是,我有一些问题。打开按预期工作,它会生成一个新进程并显示“服务器就绪”消息。但是当我尝试使用打印功能(例如echo:print("Some message.").时),我得到了结果,但它不像我想的那样工作。它将我的消息打印为列表(而不是字符串)并生成

=ERROR REPORT==== 18-Jul-2010::01:06:27 ===
Error in process <0.89.0> with exit value: {badarg,[{erlang,register,[echo,<0.93.0>]},{echo,start,0}]}

错误消息。 此外,当我尝试通过echo:stop()停止服务器时,我收到了另一个错误

** exception error: bad argument
 in function  echo:stop/0

有人可以解释一下,这里发生了什么?我是Erlang的新手,此时似乎很难掌握。

1 个答案:

答案 0 :(得分:9)

当您的loop/0功能收到print消息时,您再次致电start/0,这会产生新进程并尝试再次将其注册为echo。它会导致您的服务器死机而新的服务器未注册为echo,因此您无法再通过print/1功能向其发送消息。

loop() ->
    receive
        {print, Msg} ->
            io:format("You sent a message: ~w.~n", [Msg]),
            loop();   % <-- just here!
        stop ->
            io:format("Server is off.~n");
        _ ->
            io:format("Unidentified command.~n"),
            loop()
    end.