我正在编写一个需要将信息传播到其他服务器的服务器。为了实现这一点,我编写了一个简单的客户端协议,写入给定的服务器。我使用deferreds来调用transport.write(),并且我已通过print语句确认我的回调被调用,但我从来没有从我的服务器获得任何输出。
我的代码在这里: https://gist.github.com/sakekasi/9460002
也许我因某种原因阻止反应堆运行?我很确定我没有,因为我没有使用任何长时间运行的循环。
提前致谢。
编辑:快速浏览我的代码
我根据字典端口实例化5台服务器。对于每个服务器,我创建一个新工厂并将其绑定到各自的端口。
无效命令: 如果命令无效,服务器必须回复 ?命令
IAMAT: 'IAMAT name lat lon time'必须回复 AT服务器名称lat lon时间。此外,收到此命令的服务器继续将其传播到会话字典中其名称下的所有服务器。 为此,我从客户端工厂实例化客户端,并让它们根据端口字典向正确的端口发送消息。
有关代码详细信息,请查看respond.iamat
答案 0 :(得分:0)
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