Re: A lot of questions... again
Right, understand that this is still a basic example, there's quite a bit more that could be added to it, like recionnection attempts, timeouts, etc. In this setup the script acts as both client and server, so you need to press "s" to start the server, then "c" to connect to it locally. You can then press space where it will send a packet across, you'll also notice that it prints things twice, this is not a bug. When you connect it will add two user echo() classes to the user list, one is for the client side, the other for the server side. In practice there would be only one of these in the list depending on whether your strictly the server or the client, but thats not really relevant at the moment. You can press "q" to quit or "d" to disconnect clients from the server side.
import pyglet
from pyglet.window import key
from pyglet import clock
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor
from twisted.internet import task
import pickle import zlib import random pyglet.options['debug_gl'] = False #primary window/game class class Prototype(pyglet.window.Window): def __init__(self): super(Prototype, self).__init__(640, 480, resizable=False, fullscreen=False, caption="Test") self.clear() #server side connected user variable, when someone connects the Echo Class will add itself into it. #then just call self.user.sendData to transmit to the connected user or check self.user.inbox to get data. self.user = [] self.server = None self.client = None #since the Reactor is in control, to properly run the main game loop you have to manually call the clock. #this variable is to keep track of the last time the clock was ticked. self.old_dt = clock.tick() self.fps_display = pyglet.clock.ClockDisplay() #shutdown program gracefully def shutdown(self, result): reactor.stop() #system error shutdown def bailout(self, reason): reason.printTraceback() reactor.stop() #main game loop def update(self): while not self.has_exit: #manually dispatch window events (since twisted reactor is in control) self.dispatch_events() #Make sure events are timed properly while coiterating with network layer. That and tick clock events like the fps counter and game pacing. dt = clock.tick() self.old_dt = self.old_dt + dt #if enough time has passed, update game state if self.old_dt >= 0.025: self.old_dt = 0 self.clear() for a in self.user: if len(a.inbox) > 0: print(a.inbox) a.inbox = [] self.fps_display.draw() #draw here and manually flip frame buffers self.flip() #return control to twisted Reactor yield 1 def on_key_release(self,symbol, modifiers): #start server if symbol == key.S: self.server = TCP4ServerEndpoint(reactor, 8007) self.server.listen(QOTDFactory()) print("server initializing") #connect to server if symbol == key.C: self.client = reactor.connectTCP('localhost', 8007, EchoClientFactory()) print("connecting") #disconnect client from server side if symbol == key.D: for a in range(0,len(self.user),1): self.user[a].disconnect() if symbol == key.Q: if self.client != None: #disconnect from the client side print('stopping client') self.client.disconnect() self.close() if symbol == key.SPACE: for a in self.user: a.sendData("space pressed") #this handles two way communication with connected clients class Echo(Protocol): #data reciever class def connectionMade(self): #add this class to the main program window.user.append(self) #stored incoming data self.inbox = [] def dataReceived(self, data): data = "" data = "" self.inbox.insert(0,data) def sendData(self,data): data = "" data = "" self.transport.write(data) def disconnect(self): self.transport.loseConnection() #this monitors the port and automatically calls Echo() when someone connects, passing their address to it. class QOTDFactory(Factory): def buildProtocol(self, addr): print(addr, "connected.") return Echo() #This class establishes a connection to a server. class EchoClientFactory(ClientFactory): def startedConnecting(self, connector): print('Started to connect.') def buildProtocol(self, addr): print('Connected.') return Echo() def clientConnectionLost(self, connector, reason): print('Lost connection. Reason:', reason) def clientConnectionFailed(self, connector, reason): print('Connection failed. Reason:', reason) if __name__ == '__main__': #initialize main window window = Prototype() #port to listen to task.coiterate(window.update()).addCallback(window.shutdown).addErrback(window.bailout) #start reactor loop reactor.run()
-- Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector