一言で言えば 、クライアントが接続してメッセージを送受信するソケット サーバーを作成しようとしています (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 は、クライアントが切断されたために接続が失われた場合にのみ呼び出されます。クライアントがデータを送信するたびに、何も起こりません。
何が問題なのですか?私はこれにかなりの時間を費やしましたが、本当にわかりません。どうもありがとう。