在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端最低层的样子。如果你知道的话,更高层是什么?浏览器方面有什么?
答案 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
答案 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)
典型的开发模式会话如下所示:
What's the exact protocol of this process?
Development mode使用特殊引擎将您的应用程序作为Java字节码和本机JavaScript的混合运行。
官方文档本身非常清楚运行应用程序时会发生什么。
当你开始跑步时
这意味着您在没有将其转换为JavaScript的情况下与GWT应用程序进行交互。无论何时从Java集成开发环境(IDE)编辑,运行和调试应用程序,您都在开发模式下工作。当应用程序在开发模式下运行时,Java虚拟机(JVM)实际上将应用程序代码作为编译的Java字节码执行,使用GWT管道连接到浏览器窗口。这意味着IDE的调试工具可用于调试客户端GWT代码和任何服务器端Java代码。