保持服务器"live"



我正在 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,然后我按输入键说Hellllooooooooooooo。或者我也可以在 Erlang 中使用我的客户端,但关键是如何让服务器通过 telnet 或客户端接口发送与他连接的消息?

如果我很好地理解了你的意图,这里有一些一般提示:

  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 发送回复(足以满足信号)。因此,第二种方法的通用代码可能如下所示:

receive

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

最新更新