Як пабудаваць канчатковыя кропкі з t.c.telnet

Мая мэта складаецца ў тым, каб стварыць телнет кліентаў у якасці канчатковых кропак у поле TCP4ClientEndpoint рэалізацыі.

Вось што Я раблю:

class TelnetClient( TelnetProtocol ):
    ...

factory = Factory()
factory.protocol = TelnetClient
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 )
defer = point.connect( factory )

defer.addCallback( todo )
reactor.run

<Код> TelnetClient клас выконвае праверку сапраўднасці, пры ўваходзе, страляючы каманд і г.д.

калі я выкарыстоўваю гэты падыход, я магу прачытаць некаторыя выходныя прэч DataReceived , але гэта giberish.

Кліенцкія функцыі телнет, як чакаецца, калі яна пабудавана па Завод , а затым reactor.connectTCP (...) выклікаецца з Завод .

Што гэта такое, што Im тут раблю няправільна?

Дзякуй!

EDIT 1 connecting TelnetClient to factory.protocol via TelnetProtocol

class TelnetClient( TelnetProtocol ):
    ...

factory = Factory()
factory.protocol = TelnetTransport( TelnetClient )
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 )
defer = point.connect( factory )

defer.addCallback( todo )
reactor.run

EDIT 2 solved. The final piece was ClientFactory.

class TelnetClient( TelnetProtocol ):
    ...

factory = ClientFactory()
factory.protocol = TelnetTransport( TelnetClient )
point = TCP4ClientEndpoint( reactor, x.x.x.x, 23 )
defer = point.connect( factory )

Рашэнне гэтай праблемы было два разы.

  1. Так як мы хочам, каб кліент Telnet, мы павінны пераканацца, што пратакол з'яўляецца асобнікам TelnetProtocol .

  2. Завод павінен быць ClientFactory . Калі мы паглядзім на крыніцу twisted.internet.endoints , мы бачым, што завод мы пераходзім у да канцоў заварочваюць у _WrappingFactory , які з'яўляецца нашчадкам ClientFactory . Калі гэты завод мы перадаем не мае тыя ж атрыбуты, ClientFactory , затым _wrappedFactory будзе выклікаць AttributeErrors, калі ён спрабуе выклікаць метады ClientFactory

2

1 адказы

Вы маеце рацыю, што connectTCP і endpoint.connect функцыянальна аднолькавыя (па большай частцы).

Калі выказаць здагадку, што TelnetProtocol гэта twisted.conch.telnet.TelnetProtocol , праблема тут у тым, што TelnetProtocol на самой справе не павінен падлучацца непасрэдна да TCP транспарту , ён павінен падключыцца да twisted.conch.telnet.TelnetTransport . Гэта «трызненне» у DataReceived , які вы бачыце фактычныя байты пратаколу Telnet, якія, як мяркуецца, павінен быць прааналізаваны з дапамогай twisted.conch.telnet.TelnetTransport (які сам па сабе з'яўляецца IProtocol ), каб выклікаць метады, такія як enableLocal і enableRemote на TelnetTransport .

Я б выказаў здагадку, што ў вашым connectTCP заснаванае прыклад, вы, верагодна, инстанцировании TelnetTransport і ўстаноўка яго .protocol прыпісваць кропку ў TelnetProtocol .

У асноўным, пераканайцеся, што Завод аб'ект, які вы перадаеце ў ёсць дакладна той жа пратакол атрыбут як ClientFactory вы выкарыстоўваеце ў сваім connectTCP прыклад.

У будучыні, таксама, калі ласка, уключыце поўныя, гатовыя да выканання прыклады кода, так што мы можам запусціць іх і паглядзець, што адбываецца, а не гадаць :-).

1
дададзена
Правільна, у версіі connectTCP Im выкарыстаннем TelnetTransport. Перш чым я вывесіў гэтае пытанне я паспрабаваў рэалізацыі тое ж самае з канчатковай кропкай. Праверце мой выбар. Праблема ёсць, што AttributeError паднятая кажучы Nonetype ня connectionLost. Я havnt параўнаць атрыбуты, як вы прапануеце яшчэ. Мой код так узламаны прама зараз, Ill апублікаваць прыклад, які працуе раніцай (раніцай да мяне :))
дададзена аўтар sbartell, крыніца
Праблема вырашана на забеспячэнне аб'екта Factory мае тыя ж атрыбуты, ClientFactory. Праверце змены.
дададзена аўтар sbartell, крыніца
дзякуй за дапамогу!
дададзена аўтар sbartell, крыніца