3

こんにちは私はErlangの新しい蜂ですが、パッシブモードでクライアントを受け入れてメッセージを表示する単純なTCPサーバーを作成することができました。新しいクライアントがサーバーに接続するたびに、新しいプロセスを生成します。クライアントが接続したときに生成されるプロセスを使用して、クライアントにメッセージを送信する方法はありますか?

これがコードです。

-module(test).

-export([startserver/0]).

startserver()->
{ok, ListenSocket}=gen_tcp:listen(1235,[binary,{active, false}]),
connect(ListenSocket).

connect(ListenSocket)->
{ok, UserSocket}=gen_tcp:accept(ListenSocket),
Pid=spawn(? MODULE, user,[UserSocket]),
gen_tcp:controlling_process(UserSocket, Pid),
connect(ListenSocket).

user(UserSocket)->
case gen_tcp:recv(UserSocket, 0) of.
{ok, Binary}->% Send basic message.

{error, closed}->% operation on close. 
end.

私がそうするようなものを私は持つことができますか?

Pid!{"Some Message"}。そして、メッセージは、非ブロッキングioを使用してプロセスに関連付けられたソケットに送信されます。

4

1 に答える 1

5

OTPの原則を使用してTCPサーバーを作成するために、このチュートリアルを試すことができます:http: //learnyousomeerlang.com/buckets-of-sockets#sockserv-revisited

接続ループの代わりにgen_serverを使用する場合は、Pidを状態で保存できます。次に、gen_server:cast / 2を使用して、Pidの1つにメッセージを送信できます。

制御プロセスからクライアントにメッセージを送信する関数はgen_tcp:send(Socket、Message)であるため、たとえば、接続時に1回限りのメッセージを送信する場合は、次のようにします。

user(UserSocket)->
gen_tcp:send(UserSocket, "hello"),
case gen_tcp:recv(UserSocket, 0) of
   {ok, Binary}->% Send basic message.
        gen_tcp:send(UserSocket, "basic message"),
   {error, closed}->% operation on close. 
        gen_tcp:send(UserSocket, "this socket is closing now"),
end.
于 2012-11-28T09:48:19.157 に答える