0

GWTについて質問です。私の GWT クライアント アプリが TCP ソケットに接続し、いくつかの処理を行ってから閉じる必要があるとしましょう。ソケットがクライアント側で機能しないため、GWT 内ではほとんど不可能になりました。

しかし、実際には、次のように、アプリケーションのサーバー側でソケットを作成できます。

package com.kurjerzy.testGWT.server;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;

import com.kurjerzy.testGWT.client.GreetingService;
import com.kurjerzy.testGWT.shared.FieldVerifier;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
        GreetingService {

    public String greetServer(String input) throws IllegalArgumentException {
        // Verify that the input is valid. 
        if (!FieldVerifier.isValidName(input)) {
            // If the input is not valid, throw an IllegalArgumentException back to
            // the client.
            throw new IllegalArgumentException(
                    "Name must be at least 4 characters long");
        }

        String serverInfo = getServletContext().getServerInfo();
        String userAgent = getThreadLocalRequest().getHeader("User-Agent");

        // Escape data from the client to avoid cross-site script vulnerabilities.
        input = escapeHtml(input);
        userAgent = escapeHtml(userAgent);

        String rStr = null;

        try {
            InetAddress addr = Inet4Address.getByName( "google.com" );
            Socket s = new Socket( addr , 80 );
            rStr = "connected!";
        } catch ( Exception e ) {
            rStr = "e: " + e.getMessage();
        }

        return "Hasdasdello, " + input + "!<br><br>I am running " + serverInfo
                + ".<br><br>It looks like you are using:<br>" + userAgent + "<br>rStr=" + rStr;
    }

    /**
     * Escape an html string. Escaping data received from the client helps to
     * prevent cross-site script vulnerabilities.
     * 
     * @param html the html string to escape
     * @return the escaped string
     */
    private String escapeHtml(String html) {
        if (html == null) {
            return null;
        }
        return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
                .replaceAll(">", "&gt;");
    }
}

残念ながら、サーバーレットにはソケット接続を作成する権限がなく、例外が発生します。

これを実装する方法はありますか?

私が達成したいことは次のとおりです。

1) サーバーに接続するネイティブ Java、Android、および gwt リアルタイム ゲーム クライアントを持つ

2) 一度にすべてのクライアントにロジックを提供するサーバーを持つ

そのため、ネイティブ Java および Android クライアントは、従来の tcp ソケットを使用してサーバーに接続できます。今、html5環境から同じゲームサーバーへの接続を許可したいのですが、どの接続トランスポートを使用すればよいかわかりません...

可能な鉱山のアイデアは次のとおりです。

a)サーバーレットにrpc呼び出しを受け入れさせ、ソケットを使用してゲームサーバーと通信させます(ただし、拒否された許可を渡す方法は?..)

b) gwt クライアントにサードパーティの JavaScript ソケット ライブラリを使用させ、ゲームサーバーに直接接続します (ただし、どれを使用するのが適切でしょうか?)

多分あなたはより良いアイデアを持っていますか?

ゲームはターン制なのでタイム クリティカルなコードではありませんが、データはリアルタイムで転送されます (遅延は許容されますが、最初のプレーヤーの動きを 2 番目のプレーヤーに通知するために、常に接続を維持する必要があります)。

前もって感謝します。

4

1 に答える 1

0

html5 で Web ソケット API を調べましたか -

1) http://code.google.com/p/gwt-comet/wiki/WebSockets (Chrome のみ)

2) HTML5 WebSocket API をサポートするブラウザは?

3) http://www.html5rocks.com/en/tutorials/websockets/basics/

また、PlayN , Titanium , PhoneGAPまだ見ていない場合は、etc を簡単に見てみるとよいでしょう。あなたの質問は、低レベルのものを手作業で処理しようとしていることを示しています。上記のテクノロジーをブラウズします。彼らはすでにこれらの問題を解決しているかもしれません。

于 2012-12-05T10:49:30.417 に答える