首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang简单服务器问题

Erlang简单服务器问题
EN

Stack Overflow用户
提问于 2010-07-18 07:15:02
回答 1查看 1.8K关注 0票数 6

当我学习Erlang的时候,我正在尝试解决ex。4.1 "Erlang Programming“一书(O‘’Reilly)中的”一个Echo服务器“,我有一个问题。我的代码看起来像这样:

代码语言:javascript
复制
-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.

不幸的是,我有一些问题。打开后,它会产生一个新的进程,并显示"Server is ready“消息。但是当我尝试使用打印函数(例如echo:print("Some message."). )时,我得到了结果,但它并不像我想要的那样工作。它将我的消息打印为列表(而不是字符串),并生成

代码语言:javascript
复制
=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()停止服务器时,我得到了另一个错误

代码语言:javascript
复制
** exception error: bad argument
 in function  echo:stop/0

有没有人能解释一下,这是怎么回事?我刚接触Erlang,现在似乎很难掌握它。

EN

回答 1

Stack Overflow用户

发布于 2010-07-18 08:45:04

当您的loop/0函数收到print消息时,您将再次调用start/0,这将产生新的进程,并再次尝试将其注册为echo。它会导致你的服务器死机,新的服务器没有注册为echo,所以你不能再通过print/1函数向它发送消息了。

代码语言:javascript
复制
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.
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3273623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档