保持服务器“活”

时间:2014-01-03 14:45:39

标签: tcp erlang

我在Erlang中创建了一个服务器,我遇到了一个无法解决的问题。我有我的服务器和客户端,服务器监听客户端发送消息在控制台中输出它然后什么都不做。我试图让他“活着”等待很多客户的信息并回答他们。

这是代码

init(PortNumber) ->
server_logger:init(),

% default options = [data type, socket work mode]
DefaultOptions = [binary, {packet, 0}, {active, false}, {reuseaddr, true}],

case gen_tcp:listen(PortNumber, DefaultOptions) of
     {ok, ListenSocket} ->
        server_logger:print_fmsg("Listening on port: ~B", [PortNumber]),
        server_logger:print_newline(),
        server_logger:print_fmsg(": ", []),
        case gen_tcp:accept(ListenSocket) of
            {ok, Socket} ->
                {ok, Bin} = do_recv(Socket, []),
                ok = gen_tcp:close(Socket),
                Bin;
            {error, closed} ->
                server_logger:print_msg("The connection is closed and cannot listen.")
        end;
    {error, Reason} -> 
        server_logger:print_fmsg("Cannot listen, cause: ~w", [Reason])
 end.

do_recv(Socket, Bs) -> 
    case gen_tcp:recv(Socket, 0) of
        {ok, B} -> 
            case B of 
                %do_recv(Socket,  [Bs, B]);
                _ -> gen_tcp:send(Socket, "Hellllooooooooooo")
            end;
        {error, closed} -> 
            {ok, list_to_binary(Bs)}
    end.

我不知道我正在做什么是正确的,例如:我有服务器的控制台,我用server:init(8889)创建他,在cmd我输入telnet localhost 8889然后按Enter键它说Hellllooooooooooo。或者我也可以在Erlang中使用我的客户端,但关键是如何让服务器通过telnet或客户端接口发送连接到谁的消息?

1 个答案:

答案 0 :(得分:3)

如果我没有理解你的意图,这里有一些一般的提示:

  1. 要使服务器“保持活动”,接收函数必须是尾递归的。所以基本上该函数应该:等待一个信号,当它得到一个 - 服务它并再次递归调用自己。要使其停止,只需指定一个特殊的消息,它将在到达函数时停止递归。非常通用的代码(获取消息并打印对屏幕的相应响应):

    serveSignal() ->

        receive 
            hello -> io:format("Hello World!"),
                     serveSignal();
            bye   -> io:format("Bye World!"),
                     serveSignal();
            stop  -> {"Server stopped", ok};
            _     -> unknownMessage,
                     serveSignal()
        end.
    
  2. 要使服务器响应与服务函数需要接收的不同请求/用户不同,例如,带有一些正确参数的元组。例如,让一个接收器函数获取信号,确定发送器的IP,然后将元组{IP,signal}发送到另一个函数,该函数将向给定的IP发送回复(足以发送信号)。所以第二种方法通用代码可能如下所示:

  3. receive

        {IP, signalOne} -> replyingFunctionPID ! {IP, responseToSignalOne};
        {IP, signalTwo} -> replyingFunctionPID ! {IP, responseToSignalTwo}
    end