【问题标题】:twisted client transport.write not sending data, even after close扭曲的客户端传输。写入不发送数据,即使在关闭后
【发布时间】:2014-03-10 05:40:32
【问题描述】:

我正在编写一个需要将信息传播到其他服务器的扭曲服务器。为了实现这一点,我编写了一个简单的客户端协议,它写入给定的服务器。我使用 deferreds 调用 transport.write(),并通过打印语句确认调用了我的回调,但我从未从我的服务器获得任何输出。

我的代码在这里: https://gist.github.com/sakekasi/9460002

也许我出于某种原因阻止了反应堆运行?我很确定我没有,因为我不使用任何长时间运行的循环。

提前致谢。

编辑:快速浏览我的代码

我正在根据字典端口实例化 5 个服务器。对于每个服务器,我创建一个新工厂并将其绑定到其各自的端口。

无效命令: 给定一个无效的命令,服务器必须回复 ?命令

国际航空运输协会: 'IAMAT name lat lon time' 必须用 AT servername 名称 lat lon 时间。此外,接收到此命令的服务器继续将其传播到talks 字典中其名称下的所有服务器。 为此,我从客户端工厂实例化客户端,并让它们根据端口字典向正确的端口发送消息。

代码详情请查看respond.iamat

【问题讨论】:

  • 所以听起来你有 1 个进程在 5 个端口上侦听,每个端口都有一个工厂?您的 5 台服务器(Young、Hill 等)是否从其他地方连接到此流程,或者 5 台工厂是否应该代表 5 台单独的服务器?
  • @PeterGibson 它们代表恰好位于同一台机器上的 5 个独立服务器。他们应该能够与客户和彼此交谈

标签: python python-2.7 twisted


【解决方案1】:

parse_message(line) 中的最后一行内容为:

{... }.get(toks[0], inv)()

我觉得应该是

{... }.get(toks[0])()

编辑

我可以成功发送 IAMAT 消息并由服务器解析:

nc -c localhost 12604
IAMAT b 1 2 3
AT Young 1394489423.5 b 1.0 2.0 3.0

但我对接下来会发生什么感到有点困惑。服务器似乎尝试使用 TCP4ClientEndpoint(而不是使用与客户端的现有连接)建立与自身的新连接,以便发送 AT 消息。这里好像有消息没有发送的问题,但是如果成功了,是不是会导致消息在服务器内部来回不断循环?

编辑 2

感谢您的澄清。默认情况下,Twisted 的 LineReceiver 期望行以回车符和换行符 (\r\n) 结束。您的消息正在发送,但随后被忽略,因为您的 flatten_cmd 函数仅附加 \n。将其更改为以下内容可解决此问题:

def flatten_cmd(schema, cmd):
    ret = cmd['type']
    for x in schema:
        k = x[0]
        ret = ret + ' ' + str(cmd[k])
    return ret+'\r\n'

现在服务器按预期接收更新:

got IAMAT blah 1 2 3
sending AT Farmar 1394676270.11 blah 1.0 2.0 3.0
sending AT Farmar 1394676270.11 blah 1.0 2.0 3.0
got AT Farmar 1394676270.11 blah 1.0 2.0 3.0
got AT Farmar 1394676270.11 blah 1.0 2.0 3.0

【讨论】:

  • 你要的命令是iamat命令。架构是 schemas.py 中的 iamat_schema。它应该将收到的命令转发到其他服务器
  • @sakekasi 让我知道我的最新编辑是否为您解决了问题
  • 为我做到了!我实际上最终使用了 linereceiver 方法 sendLine,但它具有相同的想法。感谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2011-01-09
相关资源
最近更新 更多