В настоящее время я следую документации для Python труб , и по большей части все шло хорошо. Проблема в том, что после того, как я внедрил класс Reverser
в свой код, ошибка TypeError продолжала появляться, когда я пытался подключиться через Te lnet.
Вот мой код:
#!/etc/python2.7
from tubes.protocol import flowFountFromEndpoint
from tubes.listening import Listener
from twisted.internet.endpoints import serverFromString
from twisted.internet.defer import Deferred, inlineCallbacks
from twisted.python import log
from tubes.framing import bytesToLines, linesToBytes
from tubes.tube import series
class Reverser(object):
def received(self, item):
yield b"".join(reversed(item))
def reverseFlow(flow):
lineReverser = series(bytesToLines(), Reverser(), linesToBytes())
flow.fount.flowTo(lineReverser).flowTo(flow.drain)
@inlineCallbacks
def main(reactor, listenOn="stdio:"):
listener = Listener(reverseFlow)
endpoint = serverFromString(reactor, listenOn)
flowFount = yield flowFountFromEndpoint(endpoint)
flowFount.flowTo(listener)
yield Deferred()
if __name__ == '__main__':
from twisted.internet.task import react
react(main, ["tcp:8000"])
I Я использую эту команду в другом терминале (Linux, Ubuntu 19.10) для подключения к серверу, показанному выше:
telnet 127.0.0.1 8000
Вторая попытка подключиться, сервер показывает это сообщение:
Unhandled Error
Traceback (most recent call last):
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/log.py", line 86, in callWithContext
return context.call({ILogContext: newCtx}, func, *args, **kw)
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/context.py", line 122, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/context.py", line 85, in callWithContext
return func(*args,**kw)
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
why = selectable.doRead()
--- <exception caught here> ---
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/tcp.py", line 1435, in doRead
protocol.makeConnection(transport)
File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/protocol.py", line 514, in makeConnection
self.connectionMade()
File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/protocol.py", line 239, in connectionMade
self._flow(self._fount, self._drain)
File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/protocol.py", line 411, in aFlowFunction
listening.impl.drain.receive(Flow(fount, drain))
File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/listening.py", line 93, in receive
item.drain))
File "/home/edgecase/Programs/Tubes/test3.py", line 19, in reverseFlow
lineReverser = series(bytesToLines(), Reverser(), linesToBytes())
File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/tube.py", line 235, in series
drains = [IDrain(tube) for tube in tubes]
exceptions.TypeError: ('Could not adapt', <__main__.Reverser object at 0x7faf92066a90>, <InterfaceClass tubes.itube.IDrain>)
В идеале сервер должен принимать любые отправленные ему данные, сторнировать эти данные и отправлять их обратно - просто как простой пример обработки данных с использованием модуля Tubes , И по жизни я не могу понять, почему это не работает. Я пытался смотреть онлайн, но я не могу найти решение. Что именно вызывает это?