1

在 GWT 概述页面上,它显示:

GWT 开发者插件跨越了调试器中的 Java 字节码和浏览器的 JavaScript 之间的差距。

感谢 GWT 开发者插件,无需将代码编译为 JavaScript 即可在浏览器中查看。您可以使用与 JavaScript 相同的编辑-刷新-视图循环,同时检查变量、设置断点,并利用 Java 提供的所有其他调试器工具。而且由于 GWT 的开发模式现在在浏览器本身中,您可以在使用 Java 编码时使用 Firebug 和 Inspector 等工具。

另一个 SO Question and Answer How GWT code How run 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++ 代码或 Java 中的BrowserChannelClient类。请注意, 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 回答
0

一个典型的开发模式会话如下所示: 在此处输入图像描述

What's the exact protocol of this process? 

开发模式使用特殊引擎将您的应用程序作为 Java 字节码和原生 JavaScript 的混合体来运行。

官方文档本身非常清楚运行应用程序时会发生什么。

当你开始跑步

这意味着您正在与您的 GWT 应用程序进行交互,而无需将其转换为 JavaScript。每当您从 Java 集成开发环境 (IDE) 编辑、运行和调试应用程序时,您都是在开发模式下工作。当应用程序在开发模式下运行时,Java 虚拟机 (JVM) 实际上将应用程序代码作为编译后的 Java 字节码执行,使用 GWT 管道连接到浏览器窗口。这意味着您的 IDE 的调试工具可用于调试您的客户端 GWT 代码和任何服务器端 Java 代码。

于 2013-08-19T19:44:58.937 回答