Erlang:Tcp Server

Rs9*_*766 3 erlang erlang-shell erlang-ports

嗨,我是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.
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我可以做些什么.

Pid!{"Some Message"}.并且消息被发送到与非阻塞io的进程相关联的套接字,

Tom*_* H. 5

您可以尝试本教程使用OTP原则编写TCP服务器:http://learnyousomeerlang.com/buckets-of-sockets#sockserv-revisited

如果使用gen_server而不是连接循环,则可以将Pids存储在状态中.然后你可以使用gen_server:cast/2向其中一个Pids发送消息.

您希望从控制进程向客户端发送消息的函数是gen_tcp:send(Socket,Message),因此,例如,如果您想在连接上发送一个关闭消息,则可以执行以下操作:

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.
Run Code Online (Sandbox Code Playgroud)