PlayN客户端与服务器的协作

PlayN客户端与服务器的协作,playn,Playn,我用PlayN编写了一个游戏,它必须使用Seam与JavaEE服务器通信。 首先,我只需要在HTML5运行的游戏 当前的问题是PlayN客户端和JavaEE服务器之间的通信 1) 首先,我尝试通过PlayN.net()接口进行通信,使用JSON交换信息。由于PlayN在8888端口上运行,而服务器在8080上运行,因此我正确地遇到了同源策略的问题 2) 现在我正在寻找一个有效的解决方案。你推荐哪一个?你还有其他想法吗 a) 我正在尝试使用RPC,如中所述 ,使用GWT syncproxy b)

我用PlayN编写了一个游戏,它必须使用Seam与JavaEE服务器通信。 首先,我只需要在HTML5运行的游戏

当前的问题是PlayN客户端和JavaEE服务器之间的通信

1) 首先,我尝试通过PlayN.net()接口进行通信,使用JSON交换信息。由于PlayN在8888端口上运行,而服务器在8080上运行,因此我正确地遇到了同源策略的问题

2) 现在我正在寻找一个有效的解决方案。你推荐哪一个?你还有其他想法吗

a) 我正在尝试使用RPC,如中所述 ,使用GWT syncproxy

b) 我尝试在与服务器相同的端口(即8080)上运行playN,这样我就不会再有同源策略的问题了。问题:HTML5 playN应用程序能否在同一端口上运行? 因此,当我使用Eclipse启动JavaEE服务器时,它还应该启动PlayN web应用程序,两者都在端口8080上,对吗

这可能吗

c) 最棘手的解决方案(目前正在运行):服务器将JSON字符串写入一个文件,playN客户端读取该文件

你推荐什么?我想实现解决方案2,因为它是最干净的解决方案,但我不知道它有多难,它是如何工作的


谢谢你的帮助

我认为问题在于您正在“运行”PlayN,与Seam服务器分离

如果我理解正确,您可以执行Maven任务以HTML形式运行游戏,另一方面运行Jboss(或任何JavaEE服务器),您应该做的就是运行

mvn包


这将创建游戏之战,然后在您的Java EE服务器上发布该战,然后您可以毫无问题地使用PlayN.net包,在单个服务器上运行这就是我们目前处理客户机/服务器通信的方式。我们使用的是无状态JavaEE体系结构,并以REST服务的形式提供一切。这允许我们通过添加更多服务器并简单地将它们添加到Glassfish配置中的集群条目中来水平扩展

但是,由于缺少反射或JSON库正在工作,它迫使我们手动在每个数据传输对象中实现toJson()方法(注意区分大小写)。我们将服务器项目作为模块添加到PlayN元项目中,并将核心作为依赖项添加到服务器中。因此,您可以将每个DTO放在核心项目上(这非常棒)。将它们放在服务器上会导致人们试图将类注释为实体,这将导致在html构建过程中失败。我目前正在考虑向构建中添加一个共享项目,就像在GWT项目中一样

这就是我们向服务器发送数据的方式(对于本例,没有任何抽象,请帮自己一个忙并实现一个):

如果PlayN允许您设置MIME类型,这样您就不必使用Gson来强制转换字符串,那么这会更好一些。然而,这种方法非常有效。我们在服务器端使用Jersey来处理其余的事情。为了让它运行,我必须将以下内容放入web.xml中:

<servlet>
    <!-- We need jersey for the REST stuff -->
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>
        com.sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.fact.server</param-value>
    </init-param>
    <init-param>
        <!-- This took me hours to find :(. It is needed to automatically
        map POJOs to JSON code. -->
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

泽西塞尔维特酒店
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.config.property.packages
com.fact.server
com.sun.jersey.api.json.POJOMappingFeature
真的
1.
泽西塞尔维特酒店
/休息/*

另外,Jersey已经包含在JavaEEAPI中,因此它是开箱即用的。我希望这有帮助。如果有人知道如何进行客户端JSON解析,请看这个问题:

这里还讨论了最佳方法:谢谢,非常有用。我能够创建游戏之战并将其部署到服务器。不,使用PlayN.net();)我可以毫无问题地进行通信我怀疑有了GWT,如果您可以使用GWT RPC机制而不是json rest api,事情就会简单得多。您仍然能够保持服务器无状态(作为GWT rpc调用的一部分传入令牌)。每个人都有自己的想法——有些人不喜欢像GWT rpc这样不透明的api,我尊重这一点。
package com.fact.server;

//I also posted the imports, for clarity.
import com.fact.core.map.MapDto;
import com.fact.core.user.SessionDto;
import com.fact.server.game.map.MapCtrl;
import com.google.gson.Gson;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.apache.log4j.Logger;

@Stateless
@Path("/map")
public class MapSrvs {

@Inject
Logger logger;

@Inject
MapCtrl mapCtrl;

Gson gson = new Gson();

@POST
@Path("/mapMdl/")
@Produces( MediaType.APPLICATION_JSON )
public MapDto getMapMdl(String sessionDtoStr) {
            //logger.info("map was requested: " + sessionDtoStr);

    // Use gson to deserialize the class. Jersey would do this, if PlayN
    // would allow to set a correct MIME type (and @Consumes was set).
    // We could simply write: getMapMdl(SessionDto sessionDto)
    SessionDto sessionDto = gson.fromJson(sessionDtoStr, SessionDto.class);
    if(sessionDto == null) {
        return null;
    }

    // [...] check for a valid session

    MapDto mapMdl = new MapDto();
    mapMdl.foo = "message from server";
    return mapMdl;
}   
}
<servlet>
    <!-- We need jersey for the REST stuff -->
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>
        com.sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.fact.server</param-value>
    </init-param>
    <init-param>
        <!-- This took me hours to find :(. It is needed to automatically
        map POJOs to JSON code. -->
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>