Skip to content

Instantly share code, notes, and snippets.

@clemesha
Created March 7, 2010 07:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clemesha/324224 to your computer and use it in GitHub Desktop.
Save clemesha/324224 to your computer and use it in GitHub Desktop.
#from here: http://pastebin.com/GZ5UdEDZ
from twisted.web import server, resource
from twisted.application import service, internet
from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.python import log, logfile
from twisted.python.log import ILogObserver
import psyco
psyco.full()
class ClientManager:
clients = []
def registerClient(self, client):
self.clients.append(client)
def broadcastMessage(self, message):
for client in self.clients:
del client.headers['server']
client.setHeader('content-type','text/plain;charset=utf-8');
client.write(message)
client.finish()
self.clients = []
class CometServer(resource.Resource):
isLeaf = False
def __init__(self):
resource.Resource.__init__(self)
self.registerChildren()
def registerChildren(self):
self.putChild( 'subscribe', Subscribe() )
self.putChild( 'publish', Publish() )
def getChild( self, path, req ):
if path == '':
return self
else:
return resource.Resource.getChild( self, path, req )
class Subscribe(resource.Resource):
isLeaf = True
def render_GET(self, req):
clientManager.registerClient(req)
return server.NOT_DONE_YET
class Publish(resource.Resource):
isLeaf = True
def render_GET(self, req):
del req.headers['server']
req.setHeader('content-type','text/plain;charset=utf-8');
clientManager.broadcastMessage(req.args['message'][0])
return "ok"
clientManager = ClientManager()
application = service.Application("App")
application.setComponent(ILogObserver, lambda _: None)
class KeepAliveSite(server.Site):
def buildProtocol(self, addr):
channel = server.Site.buildProtocol(self, addr)
transport = channel.transport
transport.setTcpKeepAlive(1)
transport.socket.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 200)
sys.puts(transport)
return channel
site = server.Site(CometServer())
service = internet.TCPServer(8001, site, backlog = 128)
service.setServiceParent(application)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment