SmartFoxServer 2x HTTP接口请求和扩展集成

在这个新的配方中,我们将看看我们如何将常规HTTP调用与SmartFoxServer运行时整合,并具体说明如何通过HTTP GET / POST请求与扩展代码进行通信。

HTTP / Extension互操作性的常见应用是调试接口和管理UI。通过这种方法,开发人员可以轻松地构建一个简单的Web界面,用于报告游戏状态,监视数据结构,用户等,从而在测试时触发事件等快速调试问题。


一个简单的例子

我们来看看一个简单的用例,说明如何使用servlet(Jetty)和扩展(SFS2X)。我们将首先构建简单的SFS2X Extension并实现handleInternalMessage(...) 方法,该方法位于两个世界之间的桥梁上。

package sfs2x.test.http.ext;
 
import com.smartfoxserver.v2.extensions.SFSExtension;
 
public class SimpleSumExtension extends SFSExtension
{
    @Override
    public void init()
    {
        trace("Simple Sum Extension -- Ready");
    }
 
    @Override
    public Object handleInternalMessage(String cmdName, Object params)
    {
        Object result = null;
 
        trace(String.format("Called by: %s, CMD: %s, Params: %s", Thread.currentThread().getName(), cmdName, params));
 
        if (cmdName.equals("numbers"))
        {
            String[] nums = ((String) params).split("\\,");
 
            int sum = 0;
 
            for (String item : nums)
            {
                try
                {
                    sum += Integer.parseInt(item);
                }
                catch(NumberFormatException nfe)
                {
                    // Skip and continue
                }
            }
 
            result = sum;
        }
 
        return result;
    }
}


handleInternalMessage(...)方法是非常通用的,允许我们发送“命令”字符串和参数对象。后者可以是从数字到数组或特定对象的集合的任何东西。类似地,返回值可以是任何对象。

在我们的例子中,我们定义一个名为“数字” 的命令,并期望一个包含逗号分隔数字的字符串。我们将把这些数字加在一起,并将结果返回给servlet。

这将允许我们使用一个简单的url请求,如

HTTP://本地主机:8080 / servlet的数量= 1,2,3,4?

将数据发送到扩展,获取结果并将其输出到我们的HTML页面,将其与其他动态数据,JSP页面,模板引擎等进行集成

为了构建扩展,我们将从我们选择的IDE导出一个jar文件,并在扩展名/ HTTPSumExtension / SumExtension.jar

然后我们打开AdminTool > Zone Configurator,选择我们的区域(例如BasicExamples)并激活扩展:

SumExt

»servlet

接下来,我们继续创建简单的servlet,作为浏览器的请求和SFS2X的扩展之间的桥梁。

package sfs2x.test.http;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.smartfoxserver.v2.SmartFoxServer;
import com.smartfoxserver.v2.extensions.ISFSExtension;
 
@SuppressWarnings("serial")
public class ExtensionHTTPFacade extends HttpServlet
{
    private final static String CMD_NUMBERS = "numbers";
 
    private SmartFoxServer sfs;
    private ISFSExtension myExtension;
 
    @Override
    public void init() throws ServletException
    {
        sfs = SmartFoxServer.getInstance();
        myExtension = sfs.getZoneManager().getZoneByName("BasicExamples").getExtension();
    }
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        Object result = null;
        String numbers = req.getParameter(CMD_NUMBERS);
 
        if (numbers != null)
            result = "RES: " + myExtension.handleInternalMessage(CMD_NUMBERS, numbers);
        else
            result = "Please pass a list of comma separated values called 'numbers'. Example ?numbers=1,2,3,4";
 
        resp.getWriter().write(result.toString());
    }
}

我们获得了对SmartFoxServer实例的引用,所以在init() 方法中发生了所有的“魔术” 。从那里我们继续访问我们想要使用的区域。

您可能已经知道,每个区域代表在服务器上运行的不同应用程序,因此该区域是我们可以访问用户列表,房间列表,区域扩展,数据库管理器等的顶级对象。

在这种情况下,我们仅引用Zone的Extension,以便稍后调用其  handleInternalMessage(...)方法。

的doGet(...)实现只是充当通过采取“一文中推进器 ”参数,将其移交到扩展,最后将结果输出到客户端。

把它们放在一起

在我们测试解决方案之前,我们需要部署servlet。如果您正在使用像Neatbeans或Eclipse这样的IDE,您可以通过几次点击生成一个.war文件,并将其部署在SFS2X / www /下。否则您可以通过在SFS2X / www / 

servlet的测试部署

ExtensionTest文件夹必须包含通常的WEB-INF /编译的类和部署描述符(web,xml),如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
   metadata-complete="false"
   version="3.1">
 
    <display-name>SFS2X Test</display-name>
 
    <servlet>
        <servlet-name>ExtensionTest</servlet-name>
        <servlet-class>sfs2x.test.http.ExtensionHTTPFacade</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ExtensionTest</servlet-name>
        <url-pattern>/ExtensionTest</url-pattern>
    </servlet-mapping>
</web-app>


重新启动服务器并在浏览器中使用此URL进行本地测试的时间:

HTTP://本地主机:8080 / servlet的数量= 100,60,50,112,88

 这将产生这一点:

的serlvet清晰度


ps:

官方文档地址:http://smartfoxserver.com/blog/http-request-and-extensions-integration/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值