- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在创建一个通用的 Erlang 服务器,它应该能够同时处理数百个客户端连接。为简单起见,我们假设服务器为每个客户端执行一些基本计算,例如,对客户端提供的每两个值进行加法或减法。
作为起点,我使用 this tutorial用于基本的 TCP 客户端-服务器交互。代表监督树的摘录:
+----------------+
| tcp_server_app |
+--------+-------+
| (one_for_one)
+----------------+---------+
| |
+-------+------+ +-------+--------+
| tcp_listener | + tcp_client_sup |
+--------------+ +-------+--------+
| (simple_one_for_one)
+-----|---------+
+-------|--------+|
+--------+-------+|+
| tcp_echo_fsm |+
+----------------+
我想扩展此代码并允许 tcp_echo_fsm
将对套接字的控制传递给两个模块之一:tcp_echo_addition
(计算每两个客户端值的加法),或 tcp_echo_subtraction
(计算每两个客户端值之间的减法)。
tcp_echo_fsm
将根据来自客户端的第一条消息选择哪个模块来处理套接字,例如,如果客户端发送 <<start_addition>>
, 然后它将控制权传递给 tcp_echo_addition
.
之前的图变成:
+----------------+
| tcp_server_app |
+--------+-------+
| (one_for_one)
+----------------+---------+
| |
+-------+------+ +-------+--------+
| tcp_listener | + tcp_client_sup |
+--------------+ +-------+--------+
| (simple_one_for_one)
+-----|---------+
+-------|--------+|
+--------+-------+|+
| tcp_echo_fsm |+
+----------------+
|
|
+----------------+---------+
+-------+-----------+ +-------+--------------+
| tcp_echo_addition | + tcp_echo_subtraction |
+-------------------+ +-------+--------------+
我的问题是:
我走的路对吗?我正在使用的教程是可扩展 TCP 服务器设计的良好起点吗?
如何将控制权从一个 gen_fsm(即 tcp_echo_fsm
)传递给另一个 gen_fsm(tcp_echo_addition
或 tcp_echo_subtraction
)?或者更好的是:这是设计服务器的正确/干净的方法吗?这related question建议在 gen_fsm 和另一个模块之间传递控制并非微不足道,这种方法可能有问题。
最佳答案
对于 2,您可以使用 gen_tcp:controlling_process/2
来传递对 tcp 连接的控制:http://erlang.org/doc/man/gen_tcp.html#controlling_process-2 .
对于 1,与将减法和加法逻辑作为有限状态机中已定义状态的一部分进行处理相比,我不确定生成新模块的值(value)。这样做会创建现在在您的监督树之外运行的代码,因此更难处理错误和重新启动。为什么不将加法和减法定义为状态机中的不同状态处理这两种状态中的逻辑?
您可以创建 tcp_echo_fsm:subtraction_state/2,3
和 tcp_echo_fsm:addition_state/2,3
来处理此逻辑并使用您的第一条消息转换到适当的状态而不是增加应用程序的复杂性。
关于sockets - 将控制权从一个 gen_fsm 传递给另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392027/
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我目前正在阅读LYAE,我试图理解为什么gen_fsm状态方法必须根据source返回任何内容。 {reply, Reply, NextStateName, NewStateData} {reply,
我正在创建一个通用的 Erlang 服务器,它应该能够同时处理数百个客户端连接。为简单起见,我们假设服务器为每个客户端执行一些基本计算,例如,对客户端提供的每两个值进行加法或减法。 作为起点,我使用
通常,如果我想要 Erlang 进程超时,我会使用以下构造: receive Msg -> ok; %% handle message after 60000 -> %% Handle
是否可以获得 gen_server 的当前状态?进程(大概是通过发送一些系统消息)?在调试时它可能很有用。 当然,我可以添加一条消息,将当前状态返回到 handle_call : get_state(
我已经使用了 supervisor 和 gen_server 行为,我可以理解它们的实际用途。但是,我不太了解 gen_fsm 和 gen_event 行为的使用。有人可以用实际例子来澄清吗? 提前致
我在 gen_fsm 回调模块 (my_fsm) 中有以下 init 方法: init(Args) when length(Args) =:= 2 -> % do work with Args
我目前正在进行一个制作游戏服务器的项目。每个玩家都应该有一个具有 gen_fsm 行为的自己的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的原子,目前我们使用 make_ref
我需要根据需要生成相同 gen_fsm 的几个独立实例,然后能够将调用路由到正确的实例。 Gproc library 似乎是一种用任意名称注册进程的好方法。它有一个功能 gproc:reg_or_lo
我一直在翻Rage Against The Finite State Machine章的教程,它使用 gen_fsm,它已被弃用而支持 gen_statem。运行测试时,我总是卡住,因为其中一个客户端
我是一名优秀的程序员,十分优秀!