2013-08-19 170 views
1

在GWT概述頁記載:什麼是GWT開發插件協議

的GWT開發插件橫跨在調試器和瀏覽器的JavaScript Java字節碼之間的差距。

感謝GWT開發者插件,沒有編譯代碼到JavaScript來在瀏覽器中查看它。您可以使用與JavaScript相同的編輯 - 刷新 - 查看循環,同時檢查變量,設置斷點並利用Java中可用的所有其他調試器工具。而且由於GWT的開發模式現在在瀏覽器本身,因此您可以在使用Java進行代碼時使用Firebug和Inspector等工具。

而另一個SO Question and Answer How GWT code runs in development code提到JS代碼被提取並放入瀏覽器進行評估並將結果發送回java。

這個過程的確切協議是什麼?任何文檔(不是非常高的)?源代碼中的位置在哪裏?如何在瀏覽器或java vm(firebug或java調試器)中跟蹤此接口?

編輯:下面的Artem回答了它在Java方面最低層的樣子。如果你知道更高的層次是什麼?瀏覽器端有什麼?

回答

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代碼。

+0

中也有一個未完成的wireshark數據包解析器。在GWT官方頁面上看到了這個。是的,它非常清晰但是太高級。我正在尋找可能使您能夠編寫客戶端替代品的詳細信息。不管怎麼說,還是要謝謝你。 – minghua

+1

如果您想編寫客戶端替代品,可以使用https://gwt.googlesource.com/gwt-plugins/+/master/common/中的C++代碼或Java中的BrowserChannelClient類。請注意,https://gwt.googlesource.com/gwt-plugins/+/master/wireshark/ –

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); 
    } 
} 
+0

中還有一個未完成的wireshark數據包解析器。真棒!這看起來像最低級別的協議。最重要的是,它看起來是一個暴露對象的列表,然後可能是對本地方法的遠程方法調用。希望有人能填補這一點。謝謝,阿爾喬姆爲我們提供了這個起點。 – minghua