我在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或客户端接口发送连接到谁的消息?
答案 0 :(得分:3)
如果我没有理解你的意图,这里有一些一般的提示:
要使服务器“保持活动”,接收函数必须是尾递归的。所以基本上该函数应该:等待一个信号,当它得到一个 - 服务它并再次递归调用自己。要使其停止,只需指定一个特殊的消息,它将在到达函数时停止递归。非常通用的代码(获取消息并打印对屏幕的相应响应):
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