Erlang: Tcp服务器

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!{"一些消息"}。并且该消息会通过非阻塞IO发送到与该进程关联的套接字。

1个回答

5
您可以尝试使用 OTP 原则编写 TCP 服务器的教程: http://learnyousomeerlang.com/buckets-of-sockets#sockserv-revisited 如果您使用 gen_server 而不是连接循环,则可以将 Pids 存储在状态中。然后,您可以使用 gen_server:cast/2 向其中一个 Pid 发送消息。
从控制进程向客户端发送消息的函数是 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.

谢谢您的回复,您能给我提供一些关于如何使用gen_server()的参考资料吗? - Rs9766
@Rs9766 请阅读 http://www.erlang.org/doc/man/gen_server.html 和 http://www.erlang.org/doc/design_principles/gen_server_concepts.html。 - rvirding
谢谢,我得到了一本解释服务器概念的书,文档很容易理解。 - Rs9766

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接