【问题标题】:Erlang simple server problemErlang简单的服务器问题
【发布时间】:2011-03-17 11:04:45
【问题描述】:

在学习 Erlang 时,我正在尝试解决 ex。来自“Erlang Programming”一书(O'Reilly)的 4.1(“An Echo 服务器”),我有一个问题。 我的代码如下所示:

-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 新手,目前似乎很难掌握。

【问题讨论】:

  • 字符串在 erlang 中表示为列表。
  • 当然你是对的,但是由于没有字符,无法显示,为什么它显示为列表,而不是字符串?但这只是一件事,不是最重要的,问题依旧。
  • @Hynek 已经解释了主要问题。字符串是整数列表,因此"abc"[97,98,99] 相同。因此,erlang 并不真正“知道”您的整数列表是否只是整数列表或字符串。在格式字符串中使用~w 只会将其打印为列表。如果您使用~p它将测试整数列表是否可以是可打印的字符串,如果可以,将它们打印为字符串。这就是外壳的作用。是的,这是故意的,不,这不是错误。将字符串作为列表使它们非常易于使用。
  • 确实,使用 ~p 参数,打印就像预期的那样工作。感谢您的提示。

标签: erlang


【解决方案1】:

当您的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.

【讨论】:

  • 当然,就是这么简单。非常感谢,看来我累了,没有注意到明显的错误。再次感谢您。
猜你喜欢
  • 2010-10-21
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2011-11-16
  • 2011-04-08
相关资源
最近更新 更多