2016-04-09 10 views
2

Ich habe jetzt ein wenig verdreht Anwendung seit etwa einem Jahr. Bis Ende Februar hat alles gut funktioniert. Seitdem kann ich keine Daten zwischen meinem Client und Server übertragen. Ich bereitete ein kleines Beispiel basiert auf meinem realen Code:Twisted 16 LineReceiver: Keine Callbacks gefeuert

Server:

from twisted.python.filepath import FilePath 
from twisted.logger import Logger, textFileLogObserver, globalLogPublisher, globalLogBeginner 
from twisted.internet.endpoints import SSL4ServerEndpoint 
from twisted.internet.ssl import PrivateCertificate, Certificate 
from twisted.internet.defer import Deferred 
from twisted.internet.task import react 
from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
import codecs 
import sqlite3 
import os 


import sys 
globalLogBeginner.beginLoggingTo([textFileLogObserver(sys.stdout)]) 
loggy = Logger() 

class Ex_Factory(Factory): 
    def __init__(self, loggy): 
     self.loggy = loggy 
    def buildProtocol(self, addr): 
     return Ex_Protocol(self.loggy) 
class Ex_Protocol(LineReceiver): 
    def dataReceived(self,data): 
     self.loggy.info('mmm') 
    def connectionMade(self): 
     self.sendLine(b'hello') 
     self.loggy.info('ConMade') 
    def __init__(self, loggy): 
     self.loggy = loggy 
     self.loggy.info('Works') 

    def lineReceived(self, data): 
     self.loggy.info('I am not called! But why?') 

def main(reactor): 
    #Set up a SSL-Endpoint 
    pemBytes = FilePath(b"private.pem").getContent() 
    certificateAuthority = Certificate.loadPEM(pemBytes) 
    myCertificate = PrivateCertificate.loadPEM(pemBytes) 
    serverEndpoint = SSL4ServerEndpoint(
     reactor, 1234, myCertificate.options(certificateAuthority) 
    ) 
    serverEndpoint.listen(Ex_Factory(loggy)) 
    return Deferred() 
react(main, []) 

Auftraggeber:

dir="/working_dir" 
certname="private.pem" 

from twisted.python.filepath import FilePath 
from twisted.internet.endpoints import SSL4ClientEndpoint 
from twisted.internet.ssl import (PrivateCertificate, Certificate, optionsForClientTLS) 
from twisted.internet.defer import Deferred, inlineCallbacks 
from twisted.internet.task import react 
from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
import os 
class SendAnyData(LineReceiver): 
    deferred = Deferred() 
    def connectionMade(self): 
     print('ConMade!') 
     self.sendLine(b"START") 
     self.transport.write(b"START\r\n") 
    def connectionLost(self, reason): 
     print('ConLost!') 
     self.deferred.callback(None) 
    def lineReceived(self, data): 
     line = data.decode("UTF-8") 

@inlineCallbacks 
def main(reactor): 
    def getServerandPort(i): 
     return ("1.2.3.4",1234) 
    pem = FilePath(b"Certificates/"+certname.encode("UTF-8")).getContent() 
    caPem = FilePath(b"Certificates/ca-private-cert.pem").getContent() 
    host, port = getServerandPort(0) 

    clientEndpoint = SSL4ClientEndpoint(
      reactor, host, port, 
      optionsForClientTLS(u"ABC", Certificate.loadPEM(caPem), 
            PrivateCertificate.loadPEM(pem)), 
    ) 
    factory = Factory.forProtocol(SendAnyData) 
    proto = yield clientEndpoint.connect(factory) 
    yield proto.deferred 

os.chdir(dir) 
react(main) 

Wenn ich ausführen, um die Anwendung auf zwei separaten Raspberry Pi mit Python 3.4.2 auf Debian Jessie, das ist die Ausgabe vom Server:

2016-04-09T11:44:01+0200 [-] Ex_Factory (TLS) starting on 1234 
2016-04-09T11:44:01+0200 [__main__.Ex_Factory#info] Starting factory <__main__.Ex_Factory object at 0xb5f2ee50> 
2016-04-09T11:44:49+0200 [__main__#info] Works 
2016-04-09T11:44:49+0200 [__main__#info] ConMade 
^C2016-04-09T11:46:54+0200 [-] Received SIGINT, shutting down. 
2016-04-09T11:46:54+0200 [twisted.protocols.tls.TLSMemoryBIOFactory] (TLS Port 1234 Closed) 
2016-04-09T11:46:54+0200 [__main__.Ex_Factory#info] Stopping factory <__main__.Ex_Factory object at 0xb5f2ee50> 
2016-04-09T11:46:54+0200 [-] Main loop terminated. 

Warum gibt es keine Linie, die hat Su wurde vom Client zum Server geschickt ("START")? Was mache ich falsch?

Vielen Dank für jede Hilfe.

Antwort

1

Fortunatelly, habe ich Hilfe von tom.prince in twisted ticket system. Er empfahl mir, den Grundparameter des connectionLost-Rückrufs auszudrucken. Ich habe einen SSLv3-Fehler bekommen, der mich zu dem Problem geführt hat: Die Zertifikate sind abgelaufen ...