1

一言で言えば 、クライアントが接続してメッセージを送受信するソケット サーバーを作成しようとしています (Learn you some erlang tutorial http://learnyousomeerlang.com/buckets-of-socketsの sockserv コードに基づいて) サーバー側コンポーネント: スーパーバイザー - 一意で、最初から開始され、gen_server の動作を持つプロセスを生成します。 gen_server の動作 プロセス - それぞれが接続を処理します。

クライアント側: ソケットに接続し、数バイトのデータを送信してから切断するクライアント。

コードの詳細 私のコードは、提示されたチュートリアルとほとんど同じです。スーパーバイザーは同じです。gen_server コンポーネントは単純化されているため、すべてをキャッチして出力するだけの handle_info ケースが 1 つしかありません。

問題 接続は成功しますが、クライアントがデータを送信すると、サーバーはデータを受信して​​いないかのように動作します (これが発生したときに 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} 一度に 1 行ずつ読み込む

binary を指定して、データをバイナリとして読み込みます。

最近、そのチュートリアルに基づいて同様の演習を行っていましたが、使用したオプションは次のとおりです。

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

于 2012-11-19T14:24:04.463 に答える
0

結論として、オプションに注意してください。私は確かに、一連のオプションの意味に注意を払っていませんでした。より絞り込んだ状況で試してみて、うまくいきました。私の問題は、 \n がメッセージ区切り文字と見なされることを意味する {packet, line} オプションでした。

于 2012-11-23T11:39:32.247 に答える