簡體   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