我正在 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 或客户端接口发送与他连接的消息?
如果我很好地理解了你的意图,这里有一些一般提示:
-
为了保持服务器"活动",接收函数必须是尾递归的。所以基本上函数应该:等待一个信号,当它得到一个信号时 - 服务它并再次递归地调用自己。要使其停止,只需指定一条特殊消息,该消息将在递归到达函数时停止递归。非常通用的代码(获取消息并打印到屏幕的相应响应):
serveSignal() ->
receive hello -> io:format("Hello World!"), serveSignal(); bye -> io:format("Bye World!"), serveSignal(); stop -> {"Server stopped", ok}; _ -> unknownMessage, serveSignal() end.
-
为了使服务器对不同的请求/用户做出不同的响应,您的服务函数需要接收,例如,带有一些适当参数的元组。例如,让你的一个接收函数获取信号,确定发送方的 IP,然后将元组 {IP, signal} 发送到另一个函数,该函数将向给定的 IP 发送回复(足以满足信号)。因此,第二种方法的通用代码可能如下所示:
receive
{IP, signalOne} -> replyingFunctionPID ! {IP, responseToSignalOne};
{IP, signalTwo} -> replyingFunctionPID ! {IP, responseToSignalTwo}
end