如何统计使用twisted登录的客户端?

2024-09-30 02:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用twisted查询在服务器上进行了多少次登录

这是服务器端的一个简短示例:

#Server side
def init():
   reactor.listenTCP(7921, XCanServerFactory())
   reactor.run()

这是客户端的一个简短示例:

#Client side
class MyApp(wx.App):
   def OnInit(self):
      messenger.registerConnectionWindowLauncher(self.chooseConnection)
      messenger.registerListWindowLauncher(self.chooseWindow)
      messenger.guiLaunchConnectionWindow()

      return True

   def chooseConnection(self, event = None):
      self.connectFrame = ConnectWindow(None, -1, "Connect to Server", shutdown)
      self.connectFrame.Fit()
      self.connectFrame.Show(1)
      self.connectFrame.connectButton.Bind(wx.EVT_BUTTON,self.connect)
      self.connectFrame.connectButton.Bind(wx.EVT_MENU,self.connect)
      return self.connectFrame

   def chooseWindow(self, event = None):
      self.chooseWinFrame = ListWindow(None, -1, "Example Window", 
            messenger, shutdown)
      self.chooseWinFrame.SetSize((240, 180))
      self.chooseWinFrame.Show(1)
      return self.chooseWinFrame

def init():
   app = MyApp(0)

   reactor.registerWxApp(app)
   reactor.run()

如何在服务器和客户端之间交换已登录用户的数量,以便每个客户端都可以看到当前登录的用户数

我对客户端和服务器之间的交换感兴趣,以便在输出窗口中通知每个用户已登录的用户数。当然,我需要一个登录窗口,您可以在其中登录,还需要一个输出窗口,其中显示某个用户和某个用户登录的信息。当然,完整的源代码更加复杂。如果你感兴趣,你可以看它here。我想把canasta游戏编程为网络程序。如果两个用户登录到服务器,那么两个玩家应该一起玩,如果三个用户登录,那么三个玩家,依此类推。但是我如何与twisted交换这些信息,因为这些程序运行在不同的计算机上,并且只与connectTCP连接


不幸的是,关于我应该包括以下功能的建议对我帮助不大:

def cmd_get_player_count(self, tag, args): # From where should this function be called? print("cmd_get_player_count") self.sendUntagged("playercount", len(GameRegistry.registry.getUserList()))

我在服务器模块中的何处调用此函数?在客户端模块中,我应该在哪里包含它,以便查询玩家的数量?请记住,我自己并没有对这些功能进行编程,而是从另一个开源游戏中接管了它们,因此我不熟悉这种服务器-客户端技术的工作原理。此外,请回答我这些问题,不要回答我从未问过的问题!这离题了,没有多大帮助


Tags: 用户self服务器none客户端示例returndef
1条回答
网友
1楼 · 发布于 2024-09-30 02:15:47

从链接的源repo中,我看到您已经启动了一个网络协议:

class XCanServerProtocol(basic.LineOnlyReceiver):
   def __init__(self):
      self._game            = None
      self._state           = "init"
      self._username        = None
      self._password        = None
      self._voteStart       = False
      # server messages to remote clients are in english by default,
      # unless the client uses the 'language' command
      self.trans = gettext.NullTranslations()



   def cmd_allplayers_admin(self, tag, args):
      for player in GameRegistry.registry.getUserList():
         self.sendUntagged("playername", player)
      self.sendOk(tag)

看起来您可以通过这种方式在客户端和服务器之间交换一些信息。如果是这种情况,答案是添加一条新的协议消息,用于交换您要传输的新信息

例如,您可以添加如下命令:

def cmd_get_player_count(self, tag, args):
    self.sendUntagged("playercount", len(GameRegistry.registry.getUserList()))

旁白:

  • 您可能不需要设计自己的协议。有许多现有的协议工作得很好,设计一个好的协议是很棘手的。首先,HTTP可能很好
  • 应该使用四个空格缩进,而不是三个空格缩进。几乎每个人都使用四个空格缩进
  • 尝试将应用程序逻辑(本例中为游戏逻辑)与协议代码分开。这使得这两个部件更容易重用
  • 不要使用通配符导入(from Game import *),因为它会使查找符号(对于人和工具)变得困难

相关问题 更多 >

    热门问题