2011-12-30 11 views
1

以下のtcpserverの簡単な例があります。私はファクタカウンタvarをudpサーバと共有するようにしています。そのため、それぞれの接続では、tcpとudpの両方に値が設定されます。私は、TCPで最初に接続するのであれば、それは...その、私はUDPのポートに接続する場合2が、その後...それが私の主な問題は、側面に沿って動作するUDPクラスを起動して3ツイスト共有tcp/udpプロトコル間の変数

#!/usr/bin/env python 

from twisted.internet.protocol import Factory, Protocol 
from twisted.internet import reactor 

class TCP(Protocol): 

    def connectionMade(self): 
     self.factory.counter += 1 
     self.transport.write(str(self.factory.counter)+'\r\n') 
     self.transport.loseConnection() 

class QOTDFactory(Factory): 

    def __init__(self, protocol='tcp'): 
     if protocol == 'tcp': 
      self.protocol = TCP 
     else: 
      self.protocol = UDP 

     self.counter = 1 

reactor.listenTCP(8007, QOTDFactory('tcp')) 
#reactor.listenUDP(8007, QOTDFactory('udp')) 

reactor.run() 

になりますでしょう私の固執ポイントです。

class QOTDFactory(Factory): 
    counter = 1 

    def __init__(self, protocol='tcp'): 
     if protocol == 'tcp': 
      self.protocol = TCP 
     else: 
      self.protocol = UDP 

     QOTDFactory.counter += 1 

答えて

2

引数をreactor.listenUDPにUDPの例に示すように、DatagramProtocolインスタンスでなければなりません:私は、私はカウンタはOKで、あなたはこのカウンタを実装するためにstatic class variableを使用することができ

+0

DatagramCounterは、TCPサーバが使用するファクタへの参照をどのように共有していますか? – kratsg

+0

優秀な質問!私の答えは実際には間違っていた。私はDatagramCounterをファクトリにフックする部分を追加するのを忘れていました。フィックスの編集された答え。 –

0

に動作します参照する方法を考えます: http://twistedmatrix.com/documents/current/core/howto/udp.htmlQOTDFactoryをUDPで使用することはできないため、TCPとUDPの選択ロジックは必要ありません。その代わりに、希望のプロトコルロジックでDatagramProtocolサブクラスを作成し、TCPサーバーが使用するファクトリへの参照を共有させます。

#!/usr/bin/env python 

from twisted.internet.protocol import Factory, Protocol 
from twisted.internet import reactor 

class StreamCounter(Protocol): 
    def connectionMade(self): 
     self.factory.counter += 1 
     self.transport.write(str(self.factory.counter)+'\r\n') 
     self.transport.loseConnection() 


class DatagramCounter(DatagramProtocol): 
    def __init__(self, factory): 
     self.factory = factory 

    def datagramReceived(self, data, address): 
     self.factory.counter += 1 
     self.transport.write(str(self.factory.counter), address) 


class QOTDFactory(Factory): 
    counter = 0 
    protocol = StreamCounter 


factory = QOTDFactory() 
reactor.listenTCP(8007, factory) 
reactor.listenUDP(8007, DatagramCounter(factory)) 

reactor.run() 

彼らはそれぞれTCPとUDPでの使用に限定されていないので、私は、StreamCounterDatagramCounterTCPUDPと改名(およびそれらはひどい説明的な名前はありませんでした;)。たとえば、reactor.listenSSLを使用してSSL上でStreamCounterを使用することもできます。

+0

申し訳ありませんが、多分質問が間違った言葉で表現された..しかし、私は私のself.counter iは、TCPクラスでそれを参照する方法でOKだと思います..私の問題は、その工場 – Mike

+0

[OK]をオフに基づいて、別のUDPクラスを起動します。しかし、正直なところ私はまだ理解していません。質問を定式化する際に少し正確になりますか?何が問題になっていますか? – gecco

1

これはお客様のニーズに適していますか?

#!/usr/bin/env python 

from twisted.internet.protocol import Factory, Protocol 
from twisted.internet import reactor 

class Counter(): 
    def __init__(self): 
    self.count = 0 

class TCP(Protocol): 

    def connectionMade(self): 
     self.factory.counter.count += 1 
     self.transport.write(str(self.factory.counter)+'\r\n') 
     self.transport.loseConnection() 

class QOTDFactory(Factory): 

    def __init__(self, protocol, counter): 
     if protocol == 'tcp': 
      self.protocol = TCP 
     else: 
      self.protocol = UDP 

     self.counter = counter 

counter = Counter() 
reactor.listenTCP(8007, QOTDFactory('tcp', counter)) 
reactor.listenUDP(8007, QOTDFactory('udp', counter)) 

reactor.run() 
関連する問題