1

GWT の概要ページには次のように書かれています。

GWT 開発者プラグインは、デバッガーの Java バイトコードとブラウザーの JavaScript の間のギャップを埋めます。

GWT 開発者プラグインのおかげで、ブラウザーで表示するためにコードを JavaScript にコンパイルする必要はありません。JavaScript で慣れ親しんだものと同じ編集 - 更新 - ビューのサイクルを使用しながら、同時に変数を検査し、ブレークポイントを設定し、Java で利用可能な他のすべてのデバッガー ツールを利用できます。また、GWT の開発モードはブラウザー自体にあるため、Java でコーディングするときに Firebug や Inspector などのツールを使用できます。

そして、別の SO の質問と回答How GWT code runs in development codeでは、JS コードが抽出されてブラウザに入れられて評価され、結果が Java に送り返されると述べています。

このプロセスの正確なプロトコルは何ですか? ドキュメントはありますか (非常に高レベルのものではありません)? ソースコードの場所はどこですか? このインターフェースをブラウザーまたは Java VM (firebug または Java デバッガー) でどのように追跡しますか?

編集:以下のArtemは、Java側の最下層からどのように見えるかを答えました。あなたが知っているなら、より高い層は何ですか?ブラウザ側には何がありますか?

4

3 に答える 3

2

実際にはすべてが wiki に文書化されています: https://code.google.com/p/google-web-toolkit/wiki/DesignOOPHM

クライアントの置き換えを作成する場合は、https://gwt.googlesource.com/gwt-plugins/+/master/commonから C++ コードを使用するか、JavaBrowserChannelClientクラスで使用できます。https://gwt.googlesource.com/gwt-plugins/+/master/wiresharkには未完成の Wireshark パケット ディセクタもあります。

于 2013-08-20T11:04:56.350 に答える
1

非常に興味深い質問です。デバッグすることにしたところ、それは本当にネイティブ プロトコルのようです。

からコール処理が開始されcom.google.gwt.dev.shell.BrowserChannelます。このクラスは、BrowserChannelClient および BrowserChannelServer によって拡張されます。

またcom.google.gwt.dev.shell.BrowserListener、ブラウザーからの新しい接続のリスナーを作成します。BrowserListener のコンストラクターは次のとおりです。

/**
 * Listens for new connections from browsers.
 * 
 * @param logger 
 * @param port 
 * @param handler 
 */
public BrowserListener(final TreeLogger logger, String bindAddress,
  int port, final SessionHandlerServer handler) {
  try {
    listenSocket = new ServerSocket();
    listenSocket.setReuseAddress(true);
    InetAddress address = InetAddress.getByName(bindAddress);
    listenSocket.bind(new InetSocketAddress(address, port));

    if (logger.isLoggable(TreeLogger.TRACE)) {
      logger.log(TreeLogger.TRACE, "Started code server on port "
          + listenSocket.getLocalPort(), null);
    }
    listenThread = new Thread() {
      @Override
      public void run() {
        while (true) {
          try {
            Socket sock = listenSocket.accept();
            TreeLogger branch = logger.branch(TreeLogger.TRACE,
                "Connection received from "
                    + sock.getInetAddress().getCanonicalHostName() + ":"
                    + sock.getPort());
            try {
              sock.setTcpNoDelay(true);
              sock.setKeepAlive(true);
            } catch (SocketException e) {
              // Ignore non-critical errors.
            }

            BrowserChannelServer server = new BrowserChannelServer(branch,
                sock, handler, ignoreRemoteDeath);
            /*
             * This object is special-cased by the SessionHandler, used for
             * methods needed by the client like hasMethod/hasProperty/etc.
             * handler is used for this object just to make sure it doesn't
             * conflict with some real object exposed to the client.
             */
            int id = server.getJavaObjectsExposedInBrowser().add(server);
            assert id == BrowserChannel.SPECIAL_SERVERMETHODS_OBJECT;
          } catch (IOException e) {
            logger.log(TreeLogger.ERROR, "Communications error", e);
          }
        }
      }
    };
    listenThread.setName("Code server listener");
    listenThread.setDaemon(true);
  } catch (BindException e) {
    logger.log(TreeLogger.ERROR, "Unable to bind socket on port " + port
        + " -- is another session active?", e);
  } catch (IOException e) {
    logger.log(TreeLogger.ERROR, "Communications error", e);
  }
}
于 2013-08-19T20:26:43.700 に答える