2012-01-28 2 views
9

PlayN을 사용하여 클라이언트/서버 카드 게임을 제작하고 싶습니다. 마음. 저는 HTML5 출력에 주로 중점을두고 있지만 향후 Android 클라이언트를 만들기로 결정한 경우 출력 플랫폼에 독립적으로하는 것이 이상적입니다. RPC 메커니즘에 어떻게 접근해야합니까?클라이언트 - 서버 PlayN 게임에서 RPC를 처리하는 방법은 무엇입니까?

이는 내가 생각했던 옵션입니다 GET()/포스트와의 RPC() 메소드

  1. 사용 JSON은 -/수용 JSON을 반환하는 서블릿을 작성하고 클라이언트 코드의 모든 버전을 그것을 사용하십시오. 이것은 가능하지만, JSON의 자세한 정보에 관심이 있습니다. Hearts가 작동하게되면 더 복잡한 게임으로 넘어 가고 싶습니다. JSON을 사용하면 클라이언트와 서버간에 많은 양의 메시지가 앞뒤로 전달 될 수 있습니다. Java에서 JSON을 사용하는 방법을 실제로 알지 못하지만,이 방법이 가능하다고 가정합니다. 제 가정은 인라인입니까? Java가 JSON과 얼마나 잘 작동합니까?
  2. GWT-RPC를 계속 사용하십시오. 내 코어 (플랫폼 독립적 인) 생성자에서 비동기 서비스 인터페이스를 사용하고, 내 HTML main()에서 GWT.create(MyService.class) (또는 적어도 그 주위의 래퍼)에 의해 생성 된 GWT 비동기 인터페이스를 전달함으로써이 작업을 수행 할 수 있습니다. 비록 이것이 비 HTML 버전에서 얼마나 잘 작동하는지 전혀 모르겠습니다. 클라이언트 측 Java 코드에서 직접 GWT-RPC를 사용할 수 있습니까?
  3. 다른 형태의 RPC를 사용하십시오. 어떤 제안?
+1

완전한 대답은 아니지만 약간 : Java는 Json과 잘 작동하지만 모든 좋은 Json 라이브러리는 PlayN에서 깨졌습니다. Jersey와 EE 스택의 다른 것들을 사용하여 Stateless REST 어플리케이션으로 서버를 구축하기 때문에 오늘 질문을 올렸습니다. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn 이렇게하면 DTO를 공유하고 형식이 안전한 콜백 및 캐스트를 사용할 수 있습니다. GWT 메소드 사용 Java 빌드를 깨뜨린 다음 GWT에 충실하고 일부 캔버스 프레임 워크를 사용할 수 있습니다. – iuiz

답변

12

Java 및 Android 플랫폼의 GWT RPC의 경우 GWT RPC 메소드에 Java 클라이언트 액세스를 제공하기 위해 gwt-syncproxy를 사용하고 있으며 Guice, Gin 및 RoboGuice를 사용하고 있습니다. 이들 각각의 타겟 플랫폼은 인스턴스화 된 Game 객체에 대한 적절한 비동기 서비스 인스턴스를 주입한다.

<dependency> 
    <groupId>javax.inject</groupId> 
    <artifactId>javax.inject</artifactId> 
    <version>1</version> 
</dependency> 

그럼 내가 어떤 분야에 @Inject 주석을 추가하십시오 PlayN 프로젝트의 핵심/pom.xml 파일에서

, 나는 다음과 같은 의존성이 필요에 따라 진/Guice/RoboGuice에서 DI를 지원하기 위해 좌표 포함 콘크리트 게임 구현의 내부 :

<dependency> 
    <groupId>com.google.gwt.inject</groupId> 
    <artifactId>gin</artifactId> 
    <version>1.5.0</version> 
</dependency> 
:

public class TestGame implements Game { 

    @Inject 
    TestServiceAsync _testService; 

    ... 

} 

html로/pom.xml 파일에서, 나는 의존성이 진 좌표를 포함 0

내가 TestGameGinjector 및 TestGameModule 클래스 생성 :

TestGameGinjector.java

@GinModules(TestGameModule.class) 
public interface TestGameGinjector extends Ginjector { 
    TestGame getGame(); 
} 

을 TestGameModule.java는

public class TestGameModule extends AbstractGinModule { 
    @Override 
    protected void configure() { 
    } 
} 

순간부터, 나는 단지를 주입 해요 TestServiceAsync 인터페이스를 사용하기 때문에 TestGameModule.configure() 메소드에 구현할 필요가 없습니다. Gin은 GWT.create()를 통해 AsyncServices 인스턴스를 관리합니다.

나는 다음 TestGame.gwt.xml

<inherits name='com.google.gwt.inject.Inject'/> 

에 다음 마지막으로, 나는 TestGameHtml에 다음 변경을 추가했다.자바

public class TestGameHtml extends HtmlGame { 

    private final TestGameGinjector _injector = GWT.create(TestGameGinjector.class); 

    @Override 
    public void start() { 
     HtmlPlatform platform = HtmlPlatform.register(); 
     platform.assetManager().setPathPrefix("test/"); 
     PlayN.run(_injector.getGame()); 
    } 
} 

그리고 이것은 PlayN을위한 HTML5 플랫폼을 거의 다룹니다. 자바 플랫폼의

, 나는 다음과 같은 의존성은 자바/pom.xml 파일에 좌표 추가

<dependency> 
    <groupId>com.gdevelop.gwt.syncrpc</groupId> 
    <artifactId>gwt-syncproxy</artifactId> 
    <version>0.4-SNAPSHOT</version> 
</dependency> 

<dependency> 
    <groupId>com.google.inject</groupId> 
    <artifactId>guice</artifactId> 
    <version>3.0-rc2</version> 
</dependency> 

구글 코드에서 GWT-syncproxy 프로젝트가 pom.xml 파일을 포함하지 않습니다 마십시오. gwt-syncproxy의 버전으로 fork되고 git을 통해 https://bitbucket.org/hatboyzero/gwt-syncproxy.git에 있습니다. 복제 할 수 있어야합니다. mvn 클린 패키지 설치을 실행하여 로컬 Maven 저장소로 가져와야합니다.

어쨌든, 다음과 같이 나는 자바 플랫폼을위한 TestGameModule.java을 만들어 :

public class TestGameModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(TestServiceAsync.class).toProvider(TestServiceProvider.class); 
    } 

    public static class TestServiceProvider implements Provider<TestServiceAsync> { 
     public TestServiceAsync get() { 
      return (TestServiceAsync) SyncProxy.newProxyInstance(
       TestServiceAsync.class, 
       Deployment.gwtWebPath(), // URL to webapp -- http://127.0.0.1:8888/testgame 
       "test" 
      ); 
     } 
    } 
} 

을 다음과 같이 나는 TestGameJava.java 수정 :

public class TestGameJava { 

    public static void main(String[] args) { 
     Injector _injector = Guice.createInjector(new TestGameModule()); 

     JavaPlatform platform = JavaPlatform.register(); 
     platform.assetManager().setPathPrefix("test/images"); 
     PlayN.run(_injector.getInstance(TestGame.class)); 
    } 
} 

내가와 유사한 운동을 통해 갔다 Android 플랫폼 및 RoboGuice - 세부적인 내용은 없지만 관련 변경 사항/스 니펫은 다음과 같습니다.

pom.xml d ependencies

<dependency> 
    <groupId>com.gdevelop.gwt.syncrpc</groupId> 
    <artifactId>gwt-syncproxy</artifactId> 
    <version>0.4-SNAPSHOT</version> 
</dependency> 

<dependency> 
    <groupId>org.roboguice</groupId> 
    <artifactId>roboguice</artifactId> 
    <version>1.1.2</version> 
</dependency> 

<dependency> 
    <groupId>com.google.inject</groupId> 
    <artifactId>guice</artifactId> 
    <version>3.0-rc2</version> 
    <classifier>no_aop</classifier> 
</dependency> 

TestGameApplication.java

public class TestGameApplication extends RoboApplication { 
    @Override 
    protected void addApplicationModules(List<Module> modules) { 
     modules.add(new TestGameModule()); 
    } 
} 

TestGameModule.java

public class TestGameModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(TestServiceAsync.class).toProvider(TestServiceProvider.class); 
    } 

    public static class TestServiceProvider implements Provider<TestServiceAsync> { 
     public TestServiceAsync get() { 
      return (TestServiceAsync) SyncProxy.newProxyInstance(
       TestServiceAsync.class, 
       Deployment.gwtWebPath(), // URL to webapp -- http://127.0.0.1:8888/testgame 
       "test" 
      ); 
     } 
    } 
} 

TestGameActivity.java

012,351
public class TestGameActivity extends GameActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    final Injector injector = ((RoboApplication) getApplication()).getInjector(); 
     injector.injectMembers(this); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void main(){ 
     platform().assetManager().setPathPrefix("test/images"); 
     final Injector injector = ((RoboApplication) getApplication()).getInjector(); 
     PlayN.run(injector.getInstance(TestGame.class)); 
    } 
} 

내 프로젝트에서 Gin/Guice/RoboGuice + GWT를 사용하는 방법에 대해 빠르고 간단하게 요약 할 수 있습니다. Java 및 HTML 플랫폼 모두에서 아름답게 작동한다는 것을 확인했습니다.

어쨌든, 여러 PlayN 플랫폼에 RPC 호출을 제공하는 GWT 접근법이 있습니다. :)

+1

나는 최근에이 문제를 해결할 수있는 많은 결함을 해결할 수 있었던 이래로 내 대답을 약간 업데이트했다 ... – hatboyzero

+0

GWT RPC로 내 일을 처리 할 수있는 것처럼 들리지만, 내가 HTML이 아닌 출력 모드를 지원하고 싶을 때. 상세한 답변을 보내 주셔서 감사합니다. –

+0

문제 없음 - 서비스 중 기쁘게 생각합니다 :) – hatboyzero

관련 문제