1

简而言之: 我正在尝试制作一个客户端连接并发送/接收消息的套接字服务器(基于 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 仅在连接丢失时被调用,因为客户端断开连接。每当客户端发送数据时,什么都不会发生。

可能是什么问题呢?我花了很长时间在这上面,我真的不知道。非常感谢。

4

2 回答 2

0

您是否尝试过在http://www.erlang.org/doc/man/inet.html#setopts-2中设置其他选项

inet:setopts(AcceptSocket, [{active, true}])

例如:

{packet, line} 一次读取一行

binary 以二进制形式读入数据。

我最近也在根据该教程进行类似的练习,我使用的选项是:

inet:setopts(LSocket, [{active,true}, {packet, line}, 二进制, {reuseaddr, true}]),

于 2012-11-19T14:24:04.463 回答
0

最后,请注意选项。我确实没有注意这组选项的含义。我尝试了一个更缩小的情况并解决了问题。我的问题是 {packet, line} 选项,这意味着 \n 被视为消息分隔符。

于 2012-11-23T11:39:32.247 回答