繁体   English   中英

扭曲的客户端transport.write即使关闭也不会发送数据

[英]twisted client transport.write not sending data, even after close

我正在编写扭曲的服务器,该服务器需要将信息传播到其他服务器。 为了实现这一点,我编写了一个简单的客户端协议,该协议可以写入给定服务器。 我使用了延期函数来调用transport.write(),并且通过print语句确认了我的回调已被调用,但是我从服务器未获得任何输出。

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

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

提前致谢。

编辑:我的代码的快速演练

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

无效命令:给定无效命令,服务器必须使用? 命令

IAMAT:“ IAMAT名称延迟时间”必须以AT服务器名称名称延迟时间来响应。 另外,接收到此命令的服务器将其传播到Talks词典中其名称下的所有服务器。 为此,我从客户端工厂实例化了客户端,然后让它们根据端口字典将消息发送到正确的端口。

有关代码的详细信息,请查看response.iamat

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM