什么是GWT开发人员插件协议

时间:2013-08-19 19:10:07

标签: java javascript ajax gwt developer-tools

在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端最低层的样子。如果你知道的话,更高层是什么?浏览器方面有什么?

3 个答案:

答案 0 :(得分:2)

维基中记录的所有内容实际上都是:https://code.google.com/p/google-web-toolkit/wiki/DesignOOPHM

如果要编写客户端替换,可以使用https://gwt.googlesource.com/gwt-plugins/+/master/common中的C ++代码或BrowserChannelClient类中的Java代码。请注意,https://gwt.googlesource.com/gwt-plugins/+/master/wireshark

中还有一个未完成的wireshark数据包解析器

答案 1 :(得分: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);
  }
}

答案 2 :(得分:0)

典型的开发模式会话如下所示: enter image description here

What's the exact protocol of this process? 

Development mode使用特殊引擎将您的应用程序作为Java字节码和本机JavaScript的混合运行。

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

当你开始跑步时

  

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