用动态语言实现你的命令

关键字: 动态语言, Dynamic Language, IronPython, IronRuby, 脚本, Dynamic Commands, 动态命令

为你的 SuperSocket 启用动态语言

步骤如下:

  • 添加 DLR (dynamic language runtime) 配置片段;

Section 定义:

  1. <section name="microsoft.scripting" requirePermission="false"
  2. type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting"/>

Section 内容:

  1. <microsoft.scripting>
  2. <languages>
  3. <language extensions=".py" displayName="IronPython"
  4. type="IronPython.Runtime.PythonContext, IronPython"
  5. names="IronPython;Python;py"/>
  6. </languages>
  7. </microsoft.scripting>
  • 增加 DLR 命令加载器;
  1. <SuperSocket>
  2. ......
  3. <commandLoaders>
  4. <add name="dynamicCommandLoader" type="SuperSocket.Dlr.DynamicCommandLoader, SuperSocket.Dlr"/>
  5. </commandLoaders>
  6. </superSocket>
  • 为你的服务器实例启用该命令加载器:
  1. <servers>
  2. <server name="IronPythonServer"
  3. serverTypeName="IronPythonService"
  4. ip="Any" port="2012"
  5. maxConnectionNumber="50"
  6. commandLoader="dynamicCommandLoader">
  7. </server>
  8. </servers>

完整的配置如下:

  1. <?xml version="1.0"?>
  2. <configuration>
  3. <configSections>
  4. <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
  5. <section name="microsoft.scripting" requirePermission="false"
  6. type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting"/>
  7. </configSections>
  8. <appSettings>
  9. <add key="ServiceName" value="SupperSocketService" />
  10. </appSettings>
  11. <connectionStrings/>
  12. <superSocket>
  13. <servers>
  14. <server name="IronPythonServer"
  15. serverTypeName="IronPythonService"
  16. ip="Any" port="2012"
  17. maxConnectionNumber="50"
  18. commandLoader="dynamicCommandLoader">
  19. </server>
  20. </servers>
  21. <serverTypes>
  22. <add name="IronPythonService"
  23. type="SuperSocket.QuickStart.IronSocketServer.DynamicAppServer, SuperSocket.QuickStart.IronSocketServer" />
  24. </serverTypes>
  25. <commandLoaders>
  26. <add name="dynamicCommandLoader" type="SuperSocket.Dlr.DynamicCommandLoader, SuperSocket.Dlr"/>
  27. </commandLoaders>
  28. </superSocket>
  29. <microsoft.scripting>
  30. <languages>
  31. <language extensions=".py" displayName="IronPython"
  32. type="IronPython.Runtime.PythonContext, IronPython"
  33. names="IronPython;Python;py"/>
  34. </languages>
  35. </microsoft.scripting>
  36. <startup>
  37. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  38. </startup>
  39. </configuration>

确保所有的程序集在你的工作目录都存在

所需的文件如下: Microsoft.Dynamic.dll Microsoft.Scripting.dll IronPython.dll SuperSocket.Dlr.dll

实现你的命令

现在, 如果你有一个命令行协议的服务器实例 "IronPythonServer", 而且我们要用 Python 创建一个 "ADD" 命令用于让两个整数相加,然后把计算结果返回给客户端, 我们就要完成下面的步骤:

  • 创建 python 脚本文件 "ADD.py", 并书写如下内容:
  1. def execute(session, request):
  2. session.Send(str(int(request[0]) + int(request[1])))
  • 将此文件放入工作目录的子目录 "Command" 里

  1. WorkRoot -> Command -> ADD.py
  • 启动服务器,并通过Telnet客户端验证功能
  1. telnet 127.0.0.1 2012
  2. Client: ADD 100 150
  3. Server: 250

你会发现 ADD.py 位于 Command 文件夹的根目录, 因此 SuperSocket 允许所有实例加载它. 如果你只想要服务器实例 "IronPythonServer" 使用它, 你应该把脚本文件放到Command目录的子目录 "IronPythonServer" 里面:

  1. WorkRoot -> Command -> IronPythonServer -> ADD.py

动态命令的更新

SuperSocket每5分钟检查一次Command文件夹的更新. 如果你有任何包括新增,更新,删除的命令文件的操作, SuperSocket 将会在 5 分钟之内应用这些改动.

为动态命令增加命令过滤器

由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行时.

ADD.py

  1. def getFilters():
  2. return [LogTimeCommandFilter(), LoggedInValidationFilter()]
  3. def execute(session, request):
  4. session.Send(str(int(request[0]) + int(request[1])))