二郎 : Tcp Server

标签 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.

如果我有,我能不能有一些类似的东西。

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

最佳答案

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

如果您使用 gen_server 而不是连接循环,则可以将 Pid 存储在状态中。然后您可以使用 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.

关于二郎 : Tcp Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13599717/

相关文章:

recursion - 我的消息传递示例有什么问题?

erlang - 我可以将包含目录添加到 erl 命令中吗?

erlang - 如何通过 ID 获取 Erlang 端口?

erlang - Erlang Eunit 测试套件的常用设置和拆卸方法

concurrency - 如果 gen_server 进程中的 init/1 函数向自己发送一条消息,它是否保证在任何其他消息之前到达?

erlang - 将字符串附加到列表中的项目 :flatten in Erlang?

file-io - 如何在erlang中打开具有相关路径的文件?

erlang - 如何创建不是 Erlang OTP 应用程序的钢筋模块?

c++ - Erlang 和 C/C++ 集成的状态?

c++ - Erlang 端口无法正确处理 C++/Qt 回复