Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python twisted client transport.write即使在关闭后也不发送数据_Python_Python 2.7_Twisted - Fatal编程技术网

Python twisted client transport.write即使在关闭后也不发送数据

Python twisted client transport.write即使在关闭后也不发送数据,python,python-2.7,twisted,Python,Python 2.7,Twisted,我正在用twisted编写一个服务器,它需要将信息传播到其他服务器。为了实现这一点,我编写了一个简单的客户端协议,它可以写入给定的服务器。我使用deferreds调用transport.write(),并通过print语句确认调用了回调,但我从未从服务器获得任何输出 我的代码在这里: 也许我因为某种原因阻止了反应堆的运行?我很确定我没有,因为我没有使用任何长时间运行的循环 提前谢谢 编辑:快速浏览我的代码 我根据字典端口实例化了5台服务器。对于每台服务器,我创建一个新工厂并将其绑定到各自的端口

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

我的代码在这里:

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

提前谢谢

编辑:快速浏览我的代码

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

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

IAMAT: “IAMAT name lat lon time”必须以 在服务器名lat lon时间。此外,接收此命令的服务器继续将其传播到talks字典中其名称下的所有服务器。 为此,我从客户机工厂实例化客户机,并让他们根据端口字典向正确的端口发送消息


有关代码详细信息,请参阅respond.iamat

解析消息(行)中的最后一行内容如下:

{... }.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希望行由回车符和新行字符(
\r\n
)终止。正在发送您的消息,但随后会被忽略,因为您的
展平\u 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_模式。它应该将收到的命令转发给其他人servers@sakekasi让我知道我的最新编辑是否为您解决了问题,您为我解决了问题!实际上,我最终使用了linereceiver方法sendLine,但它有相同的想法。谢谢你的帮助!听起来好像有一个进程监听5个端口,每个端口有一个工厂?您的5台服务器(Young、Hill等)是从其他地方连接到此流程的,还是这5个工厂应该代表5台独立的服务器?@PeterGibson他们代表5台恰好位于同一台机器上的独立服务器。他们应该能够与客户和彼此交谈