2011-10-03 3 views
1

여기에 내 현재 코드 :소켓에서 오는 데이터로 웹 퍼시를 달성하려면 어떻게해야합니까?

#!/usr/bin/env python 
from twisted.application import internet, service 
from twisted.application.service import IServiceMaker, MultiService 
from twisted.protocols import basic 
from twisted.internet import reactor, protocol, defer 
from twisted.internet.protocol import DatagramProtocol 
import datetime 

class WebPUSH(basic.LineReceiver): 
    logTemplate = ''' 
     <script type="text/javascript"> 
     pushHandler.addLi('%s') 
     </script> 
    ''' 
    def __init__(self): 
     self.gotRequest = False 

    def lineReceived(self, line): 
     if not self.gotRequest: 
      self.startResponse() 
      self.gotRequest = True 

    def startResponse(self): 
     self.sendLine('HTTP/1.1 200 OK') 
     self.sendLine('Content-Type: text/html; charset=utf-8') 
     self.sendLine('') 
     f = open('index.html', 'r') 
     self.transport.write(''.join(f.read())) 
     f.close() 
     self.logTime() 

    def logTime(self): 
     self.sendLine(self.logTemplate % datetime.datetime.now()) 
     #reactor.callLater(2, self.logTime) 

class Echo(DatagramProtocol): 

    def datagramReceived(self, data, (host, port)): 
     WebPUSH.logTime() 
     print "received %r from %s:%d" % (data, host, port) 
     self.transport.write(data, (host, port)) 

if __name__ == '__main__':  
    f = protocol.ServerFactory() 
    f.protocol = WebPUSH 
    reactor.listenTCP(8080, f) 
    reactor.listenUDP(9999, Echo()) 

    reactor.run() 

당신이 볼 수 있듯이, 나는 데이터가 수신 될 때 에코에서 WebPUSH의 메소드를 호출하는 것을 시도하고있다. WebPUSH를 실제로 인스턴스화하지 않기 때문에이 메서드를 쉽게 호출 할 수있는 것처럼 보이지 않습니다. 멀티 서비스 방식을 사용하기 위해 이것을 변환하려고 시도했지만, 뭔가 잘못하고 있다고 확신하지만 작동하지 않는 것 같습니다.

(내가 할 수있는 한) 여러 가지 서비스가 좋은 예가 아닙니다.

도움이 될 것입니다.

+1

, 나에게, 적어도, 무엇을 당신은 실제로 여기에서 성취하려고합니다. HTTP 구현의 절반에 연결된 일종의 UDP 프로토콜이 있고 클래스와 인스턴스의 차이점에 대해 혼란스러워 할 것 같습니다. 나는'MultiService'가 무엇과 관련이 있는지 이해하지 못합니다. 긴 폴링 웹 서버를 만들려고하십니까? – Glyph

답변

0

Echo 인스턴스는 .logTime()을 호출하기 위해 WebPUSH 프로토콜의 인스턴스를 필요로합니다.

당신은 main()에, 예를 들어 loggers 목록을 유지해야합니다

def connectionMade(self): 
    self.factory.loggers.append(self) 

def connectionLost(self, reason): 
    self.factory.loggers.remove(self) 

을 다음 Echo.datagramReceived에 :

for time_logger in self.loggers: 
    time_logger.logTime() 
0

... 
f.loggers = [] 
echo = Echo() 
echo.loggers = f.loggers 
... 

WebPUSH.connectionLost에서 제거 WebPUSH.connectionMade에 담기

user970077, 전자 내 블로그의 xample은 웹 푸시 작동 방식을 보여주기위한 단순화 된 데모가 될 예정이었습니다.

#!/usr/bin/env python 
from twisted.protocols import basic 
from twisted.internet import reactor, protocol, defer 
import datetime 

class WebPUSH(basic.LineReceiver): 
    logTemplate = ''' 
     <script type="text/javascript"> 
     pushHandler.addLi('%s') 
     </script> 
    '''  
    def connectionMade(self): 
     self.factory.listeners.append(self) 
     self.startResponse() 

    def connectionLost(self, reason): 
     self.factory.listeners.remove(self) 

    def lineReceived(self, line): 
     self.sendLine(self.logTemplate % line) 

    def startResponse(self): 
     self.sendLine('HTTP/1.1 200 OK') 
     self.sendLine('Content-Type: text/html; charset=utf-8') 
     self.sendLine('') 
     with open('index.html', 'r') as f: 
      self.transport.write(''.join(f.read())) 


class WebPushFactory(protocol.ServerFactory): 

    protocol = WebPUSH 

    def __init__(self): 
     self.listeners = [] 


class Echo(protocol.DatagramProtocol): 

    def __init__(self, listeners): 
     self.listeners = listeners 

    def datagramReceived(self, data, (host, port)): 
     msg = '[%s:%s] %s' % (host, port, data) 
     for listener in self.listeners: 
      # udp is not necessarily line-oriented 
      # so we can: 
      # 1) feed dataReceived and wait until the line 
      # delimiter arrives in an udp package 
      # triggering lineReceived: 
      #listener.dataReceived(msg ) 
      # or 2) fake a line by calling lineReceived direclty: 
      listener.lineReceived(msg) 

     print msg 
     self.transport.write(data, (host, port)) 

if __name__ == '__main__': 
    web = WebPushFactory() 
    reactor.listenTCP(8080, web) 
    reactor.listenUDP(9999, Echo(web.listeners)) 

    reactor.run() 

을 그리고 (UDP client and server with Twisted Python에서 촬영)를 테스트 할 수있는 클라이언트 : 여기 (JFB 제안을 포함)을하려고하는 것입니다 그것은 분명하지 않다

#!/usr/bin/env python 
from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import reactor 
from twisted.internet.task import LoopingCall 
import sys, time 

class HeartbeatSender(DatagramProtocol): 
    def __init__(self, name, host, port): 
     self.name = name 
     self.loopObj = None 
     self.host = host 
     self.port = port 

    def startProtocol(self): 
     # Called when transport is connected 
     # I am ready to send heart beats 
     self.loopObj = LoopingCall(self.sendHeartBeat) 
     self.loopObj.start(2, now=False) 

    def stopProtocol(self): 
     "Called after all transport is teared down" 
     pass 

    def datagramReceived(self, data, (host, port)): 
     print "received %r from %s:%d" % (data, host, port) 


    def sendHeartBeat(self): 
     self.transport.write(self.name, (self.host, self.port)) 


if __name__ == '__main__': 
    sender = HeartbeatSender("sender", "127.0.0.1", 9999) 
    reactor.listenMulticast(9998, sender, listenMultiple=True) 
    reactor.run() 
관련 문제