在这个新的配方中,我们将看看我们如何将常规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)并激活扩展:
»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 /
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
这将产生这一点:
ps:
官方文档地址:http://smartfoxserver.com/blog/http-request-and-extensions-integration/