erlang并行服务器错误?
我决定修改中的代码,将服务器更改为并行服务器(如本书中所述),但它无法正常工作。根据《编程Erlang》一书,下面的代码应该是presto chango,但我在第17行遇到了一个错误。这是并行服务器代码(完成的并行服务器位于底部,这只是对最后一个线程上的旧服务器代码的更改) 这就是错误所在erlang并行服务器错误?,erlang,client-server,Erlang,Client Server,我决定修改中的代码,将服务器更改为并行服务器(如本书中所述),但它无法正常工作。根据《编程Erlang》一书,下面的代码应该是presto chango,但我在第17行遇到了一个错误。这是并行服务器代码(完成的并行服务器位于底部,这只是对最后一个线程上的旧服务器代码的更改) 这就是错误所在 =ERROR REPORT==== 12-Feb-2013::23:05:13 === Error in process <0.35.0> with exit value: {{badmatch,
=ERROR REPORT==== 12-Feb-2013::23:05:13 ===
Error in process <0.35.0> with exit value: {{badmatch,{error,einval}},[{ps1,loop,1,[{file,"ps1.erl"},{line,17}]}]}
接下来是客户端代码,它也会在等待回复时死去
c1:nano("list_to_tuple([2+3*4,10+20])").
nano got not answer to "list_to_tuple([2+3*4,10+20])"
{error,timeout}
-module(c1).
-compile(export_all).
-import(lists, [reverse/1]).
%old port 2345
nano(Str) ->
{ok, Socket} =
gen_tcp:connect("localhost", 4042,
[binary, {packet, 0}]),
ok = gen_tcp:send(Socket, term_to_binary(Str)),
R = receive
{tcp,Socket,Bin} ->
io:format("Client received binary = ~p~n",[Bin]),
Val = binary_to_term(Bin),
io:format("Client result = ~p~n",[Val]),
{ok,Val}
after 5000 ->
io:format("nano got no answer to ~p~n",[Str]),
{error,timeout}
end,
% gen_tcp:close(Socket),
R.
根据文档,您得到的错误描述有点奇怪: 埃因瓦尔
Attempt to delete the current directory. On some platforms, eacces is returned instead.
我必须说,这没有多大帮助
无论如何,您不需要在循环中调用{ok,Socket}=gen\u tcp:accept(Listen)
,而它已经在par\u connect(Listen)
中完成了。但是在这种情况下,循环的参数将是Socket而不是Listen。您在per_connect中进行了更正,但没有在loop中进行更正(这是您得到错误的原因)
执行此操作时,第一个服务器是spawn,它初始化与gen_tcp:listen的连接,并等待与gen_tcp:accept的连接。一旦建立了连接,就会启动一个新进程,等待接受,并在当前进程中调用循环,连接端口作为参数
现在,您应该编写一个比我建议的更智能的客户端,它可以使用相同的开放连接循环一段时间:o)
请发布用于测试客户端和服务器的命令,好吗?谢谢…我开始3个虚拟机:werl-sname w0,werl-sname w1和werl-sname w2。在一个VM中,我启动服务器:socket\u示例:start\u nano\u server(),在另一个VM中,我启动客户机socket\u示例:nano\u client\u eval(“来自w1的你好”)。和socket_示例:nano_client_eval(“来自w2的你好”)。一个客户端可以在服务器窗口中启动,但我更喜欢在不同的窗口中分离不同的打印输出。
c1:nano("list_to_tuple([2+3*4,10+20])").
nano got not answer to "list_to_tuple([2+3*4,10+20])"
{error,timeout}
-module(c1).
-compile(export_all).
-import(lists, [reverse/1]).
%old port 2345
nano(Str) ->
{ok, Socket} =
gen_tcp:connect("localhost", 4042,
[binary, {packet, 0}]),
ok = gen_tcp:send(Socket, term_to_binary(Str)),
R = receive
{tcp,Socket,Bin} ->
io:format("Client received binary = ~p~n",[Bin]),
Val = binary_to_term(Bin),
io:format("Client result = ~p~n",[Val]),
{ok,Val}
after 5000 ->
io:format("nano got no answer to ~p~n",[Str]),
{error,timeout}
end,
% gen_tcp:close(Socket),
R.
Attempt to delete the current directory. On some platforms, eacces is returned instead.
-module(socket_examples).
-compile(export_all).
nano_client_eval(Str) ->
{ok, Socket} = gen_tcp:connect("localhost", 2345,[binary, {packet, 0}]),
nano_client_eval(Str,10,Socket).
nano_client_eval(_,0,Socket) ->
gen_tcp:close(Socket);
nano_client_eval(Str,N,Socket) ->
ok = gen_tcp:send(Socket, term_to_binary(Str ++ " loop " ++ integer_to_list(N))),
receive
{tcp,Socket,Bin} ->
io:format("Client received binary = ~p on socket ~p~n",[Bin,Socket]),
Val = binary_to_term(Bin),
io:format("Client result = ~p~n",[Val]),
timer:sleep(1000),
nano_client_eval(Str,N-1,Socket)
after 5000 ->
io:format("nano_client_eval got not answer to ~p~n",[Str]),
{error,timeout}
end.
start_nano_server() ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 0},{reuseaddr, true},{active, true}]),
spawn(fun() -> par_connect(Listen) end).
par_connect(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
spawn(fun() -> par_connect(Listen) end),
loop(Socket).
loop(Socket) ->
receive
{tcp, Socket, Bin} ->
io:format("Server received binary = ~p~n",[Bin]),
Str = binary_to_term(Bin), %% (9)
io:format("Server (unpacked) ~p~n",[Str]),
% Reply = lib_misc:string2value(Str), %% (10)
Reply = string:to_upper(Str), %% (10)
io:format("Server replying = ~p~n",[Reply]),
gen_tcp:send(Socket, term_to_binary(Reply)), %% (11)
loop(Socket);
{tcp_closed, Socket} ->
io:format("Server socket ~p closed by request~n",[Socket])
after 60000 ->
gen_tcp:close(Socket),
io:format("Server socket ~p closed, no more activity~n",[Socket])
end.