在服务器端没有收到数据
简而言之:我试图制作一个客户端连接并发送/接收消息的套接字服务器(基于sockserv代码了解一些erlang教程http://learnyousomeerlang.com/buckets-of-sockets)服务器端组件: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,因为客户端断开连接。 无论何时客户端发送数据都不会发生
可能是什么问题呢? 我花了很多时间在这个上,我真的不知道。 非常感谢。
你有没有尝试在http://www.erlang.org/doc/man/inet.html#setopts-2中设置其他选项
inet:setopts(AcceptSocket,[{active,true}])
例如:
{packet,line}一次读入一行
和
二进制以二进制形式读入数据。
我最近也在根据这个教程进行类似的练习,我的选择是:
inet:setopts(LSocket,[{active,true},{packet,line},binary,{reuseaddr,true}]),
总结一下,注意选项。 我确实没有注意到这套方案的含义。 我尝试了一个更加狭隘的情况,并将其解决。 我的问题是{packet,line}选项,这意味着 n被认为是一个消息分隔符。
链接地址: http://www.djcxy.com/p/38233.html上一篇: no data received on server side
下一篇: What is the point of having temporary children for Erlang supervisors?