简而言之: 我正在尝试制作一个客户端连接并发送/接收消息的套接字服务器(基于 Learn you some erlang tutorial http://learnyousomeerlang.com/buckets-of-sockets中的 sockserv 代码)服务器端组件: supervisor - 独特的,从一开始就开始,产生具有 gen_server 行为的进程 gen_server 行为进程 - 每个处理一个连接。
客户端:客户端连接到套接字并发送几个字节的数据然后断开连接。
代码详细信息 我的代码与本教程中的代码几乎相同。主管是相同的。gen_server 组件被简化,因此它只有一个 handle_info 案例,它应该捕获所有内容并打印它。
问题 连接成功,但是当客户端发送数据时,服务器表现得好像没有接收到数据(我希望在发生这种情况时调用handle_info)。
handle_info 确实被调用,但仅在客户端断开连接并且此事件与消息一起报告时。
我尝试 过使用 Erlang 或 Java 编写的不同客户端,我尝试过设置套接字的主动/被动状态。教程作者在发送消息后设置{active, once}。在这样创建 AcceptSocket 之后,我最终只是设置了 {active, true} :(gen_server proc 初始化为包含由主管创建的原始 ListenSocket 的状态)
handle_cast(accept, S = #state{socket=ListenSocket}) ->
{ok, AcceptSocket} = gen_tcp:accept(ListenSocket),
io:format("accepted connection ~n", []),
sockserv_sup:start_socket(), % a new acceptor is born, praise the lord
inet:setopts(AcceptSocket, [{active, true}]),
send(AcceptSocket, "Yellow", []),
{noreply, S#state{socket=AcceptSocket, next=name}}.
send(Socket, Str, Args) ->
ok = gen_tcp:send(Socket, io_lib:format(Str++"~n", Args)),
ok.
handle_info(E, S) ->
io:format("mothereffing unexpected: ~p~n", [E]),
{noreply, S}.
它绝对没有效果。handle_info 仅在连接丢失时被调用,因为客户端断开连接。每当客户端发送数据时,什么都不会发生。
可能是什么问题呢?我花了很长时间在这上面,我真的不知道。非常感谢。