📄 simserver.py
字号:
# $Id: simserver.py,v 1.13 2002/02/17 21:43:37 marijn Exp $# An air traffic simulation game.# Copyright (C) 2000,1,2 Marijn Vriens <marijn@sanity.dhs.org>## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAimport sysimport osimport setupos.environ["IDLPATH"] = setup.idl_dirimport CORBA, SimulationServer, SimulationServer__POAimport timeimport randomimport UserDictimport metaclientimport simuserimport simdataclass SimServer: def __init__(self): argv = [] argv.append('ORBIIOPIPv4=1') self.d = simdata.SimData() self.u = simuser.SimUsers() self._metaStarted = 0 self.orb = CORBA.ORB_init() self.poa = self.orb.resolve_initial_references("RootPOA") ref = SimServer_Sim_Impl(self.d, self.u)._this() self.ior = self.orb.object_to_string(ref) open(setup.sim_server_ior, "w").write(self.ior) self.meta = metaclient.MetaClient(self.ior) ref = SimServer_Ticker_Impl(self.meta, self.d, self.u)._this() self.tick_ior = self.orb.object_to_string(ref) self.poa.the_POAManager.activate() def announce(self): try: self.meta.announce() print "Meta server was notified" except(CORBA.COMM_FAILURE): if(self._metaStarted): print "Waiting for meta server to come online: #%d" % self._metaStarted self._metaStarted = self._metaStarted + 1 self.meta.reloadIor() time.sleep(0.5) else: print "Meta-server should be started" cmd = sys.argv[0] + " --meta &" os.popen(cmd, 'r', 0) self._metaStarted = 1 self.announce() def run(self): cmd = sys.argv[0] + " --ticker --ior=" + self.tick_ior + " &" os.popen(cmd) print "Done. Now starting orb" self.orb.run()class SimServer_Sim_Impl(SimulationServer__POA.Sim): def __init__(self, d, u): self.d = d self.u = u def connect(self, nick): id = 0 try: id = self.u.createUser(nick) except "NickTaken": raise SimulationServer.NickTaken return id def disconnect(self, id): try: self.u.removeUser(id) except KeyError: raise SimulationServer.NoExist return None # data related methods. def getUpdate(self, userId): #print "getUpdate called, %d" % userId try: user = self.u[userId] except(KeyError): raise SimulationServer.NoExist update = SimulationServer.UpdateType() update.planeUpdateList = user.genIdlPlaneUpdateList() update.objsEntryList = self.d.genIdlObjsEntryList(user.getTimeOfLastUpdate()) update.objsLeaveList = self.d.genIdlObjsLeaveList(user.getTimeOfLastUpdate()) self.d.reapDeleted(self.u.getUpdateTimeOfSlowestUser()) user.markAsUpdated() return update def subscribe(self, userId, entityId): #print "subscribe called" if not self.u.has_key(userId): raise SimulationServer.NoExist if not self.d.has_key(entityId): raise SimulationServer.NoExist self.u[userId].subscribeToEntity(self.d[entityId]) def unsubscribe(self, userId, entityId): #print "unsubscribe called" if not self.u.has_key(userId): raise SimulationServer.NoExist if not self.d.has_key(entityId): raise SimulationServer.NoExist self.u[userId].unsubscribeFromEntity(entityId) def giveOrder(self, userId, entityId, order): if not self.u.has_key(userId): raise SimulationServer.NoExist if not self.d.has_key(entityId): raise SimulationServer.NoExist if not order: raise SimulationServer.MissingParameter if not self.u[userId].checkAuthority(entityId): raise(SimulationServer.NoAuthorityOverObject) r = self.d[entityId].processOrder(order) self.u[userId].markAsUpdated() return r class SimServer_Ticker_Impl(SimulationServer__POA.Ticker): def __init__(self, meta, d, u): self.meta = meta self.u = u self.d = d self._metaPing = time.time() def update(self): now = time.time() for o in self.d.values(): # call update on the objs. o.update() if random.randint(0,7) < 1: # add a new obj to the sim. self._addPlane(self.d) if now > (self._metaPing + setup.sim_server_meta_ping): # send a ping to the meta server. self.meta.ping() self._metaPing = now def _addPlane(self, dataDict): o = simdata.Plane() o.pos.speed(1) o.pos.heading(random.random()*360) dataDict.add(o) # $Log: simserver.py,v $# Revision 1.13 2002/02/17 21:43:37 marijn# Improved server startup.## Revision 1.12 2002/02/04 15:50:34 marijn# Added order receiving methods## Revision 1.11 2002/02/01 15:07:36 marijn# updated copyright information## Revision 1.10 2002/01/14 15:40:41 marijn# re-indentation## Revision 1.9 2002/01/13 16:05:56 marijn# All updates now go via getUpdate(). Split genIdl into Full and Reduced## Revision 1.8 2002/01/12 23:53:56 marijn# Refactored simuser and simdata## Revision 1.7 2002/01/04 11:27:46 marijn# Debug output to show datastream.## Revision 1.6 2001/12/26 02:35:14 marijn# Added temp Plane to SimObj conversion## Revision 1.5 2001/12/26 01:24:43 marijn# Added Plane class## Revision 1.4 2001/12/25 02:00:08 marijn# various fixes and updates.## Revision 1.3 2001/11/27 20:59:06 marijn# sending of simple sim objcts## Revision 1.2 2001/11/19 00:25:58 marijn# py merged back into HEAD## Revision 1.1.2.6 2001/11/16 03:56:47 marijn# Client connects to SimServer## Revision 1.1.2.5 2001/11/15 05:20:30 marijn# Ticker process now started automaticly by sim-server## Revision 1.1.2.4 2001/11/14 06:27:47 marijn# Simserver now pings the meta server.## Revision 1.1.2.3 2001/11/11 07:25:16 marijn# Added simserver update ticker## Revision 1.1.2.2 2001/11/11 05:22:40 marijn# merged programs into one. Removed unneeded threading stuff## Revision 1.1.2.1 2001/11/07 20:08:09 marijn# Added SimServer and threading#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -