더 나은 단어가 부족하여 "대화식"클라이언트/서버 동작을 수행하기 위해 Twisted를 수행하는 방법을 생각하고 있습니다.대화 형 Python 클라이언트/서버 Twisted
서비스에 연결하는 프로토콜 및 ClientFactory 클래스를한데 모으고 즉각적인 쿼리/응답을 수행했습니다 (connectionMade -> self.queryStatus 참조). 이것은 예상대로 성공하고 Factory 클래스의 서버 응답을 인쇄합니다.
이제 내 문제는 잠재적 인 수신 데이터를 수신하면서 데이터를 보내야하는 외부 이벤트가 발생한다는 것입니다. 하지만 일단 reactor.run() 루프가 진행되면 내 응용 프로그램의 나머지 부분이 데이터 전송을 시작하는 방법을 알지 못합니다.
난 이후 몇 가지 다른 방법을 시도했지만,이 설명 된대로 RECV 부분을 처리했던 간단한 방법입니다 :
는class myListenerProtocol(LineReceiver):
delimiter = '\n'
def connectionMade(self):
print("Connected to: %s" % self.transport.getPeer())
self.queryStatus(1)
def dataReceived(self, data):
print("Receiving Data from %s" % self.transport.getPeer())
...
self.commandReceived(self.myData)
def commandReceived(self, myData):
self.factory.commandReceived(myData)
def connectionLost(self, reason):
print("Disconnected.")
def queryStatus(self, CommandValue):
...
strSend = CommandValue # or some such
self.transport.write(strSend)
class mySocketFactory(ClientFactory):
protocol = myListenerProtocol
def __init__(self):
pass
def buildProtocol(self, address):
proto = ClientFactory.buildProtocol(self, address)
return proto
def commandReceived(self, myData):
print myData
reactor.stop() # It won't normally stop after recv
def clientConnectionFailed(self, connector, reason):
print("Connection failed.")
reactor.stop()
def main():
f = mySocketFactory()
reactor.connectTCP("10.10.10.1", 1234, f)
reactor.run()
나는이 꽤 솔직 상상하지만, 많은에 수많은 시간 예제와 문서는 내가이 시나리오를 어떻게 다루어야하는지 잘 이해하지 못하고 나를 떠났습니다.
GIL에주의하지 않아도됩니다. 스레드를 사용하지 마십시오. 이 게시물에 관한 내용은 스레드에 대한 필요성을 암시하지 않으므로 GIL은 부적절합니다. – Glyph