You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@guacamole.apache.org by Go Target <wa...@gmail.com> on 2017/12/29 06:12:23 UTC

I need help.

Dear :

I created a lab. I am using sample code :

public class DemoServlet extends GuacamoleHTTPTunnelServlet {
private static final long serialVersionUID = 1L;
private final Logger logger = LoggerFactory.getLogger(DemoServlet.class);
public static SimpleGuacamoleTunnel tunnel = null;
@Override
protected GuacamoleTunnel doConnect(HttpServletRequest request) throws
GuacamoleException{
try {
if( tunnel == null) {
tunnel = inner();
}
return tunnel;
}catch(GuacamoleException e) {
logger.error(e.getMessage(), e);
throw e;
}catch(Exception e) {
logger.error(e.getMessage(), e);
throw e;
}
}
private static SimpleGuacamoleTunnel inner() throws GuacamoleException{
GuacamoleConfiguration config = new GuacamoleConfiguration();
config.setProtocol("rdp");
config.setParameter("hostname", "10.200.200.199");
config.setParameter("port", "3389");
config.setParameter("security", "nla");
config.setParameter("username", "admin");
config.setParameter("password", "P@ssw0rd");
config.setParameter("ignore-cert", "true");
config.setParameter("enable-drive", "true");
config.setParameter("drive-path", "/home/guacdshare");
config.setParameter("recording-path", "/anchor_dvr");
config.setParameter("create-recording-path", "true");
config.setParameter("recording-name", "test.guac");
InetGuacamoleSocket inet_socket = new InetGuacamoleSocket("10.200.200.200",
4822);
GuacamoleSocket socket = new ConfiguredGuacamoleSocket(inet_socket,config);
return new SimpleGuacamoleTunnel(socket);
}
}


It is ok.  I can connet to target from browser.


Next, I try to extends【GuacamoleWebSocketTunnelEndpoint】

@ServerEndpoint ("/test_Tunnel")
public class DemoEndPoint extends GuacamoleWebSocketTunnelEndpoint {
@Override
protected GuacamoleTunnel createTunnel(Session arg0, EndpointConfig arg1)
throws GuacamoleException {
*GuacamoleConfiguration target_config =
Help.createGuacamoleConfiguration();*
* GuacamoleClientInformation browser_config = **Help*
*.createGuacamoleClientInformation();*
* GuacamoleSocket gua_server_socket = **Help**.createInetGuacamoleSocket();*
* ConfiguredGuacamoleSocket socket = new ConfiguredGuacamoleSocket(
gua_server_socket, target_config, browser_config);*
* GuacamoleTunnel tunnel = **Help**.assignGuacamoleTunnel(socket);*
* return tunnel;*
}
}



public class *Help*{
public static GuacamoleConfiguration *createGuacamoleConfiguration*(){
GuacamoleConfiguration config = new GuacamoleConfiguration();
config.setParameter("port", "3389");
config.setParameter("username", "admin");
config.setParameter("hostname", "10.200.200.199");
config.setParameter("ignore-cert", "true");
config.setParameter("security", "nla");
config.setParameter("password", "P@ssw0rd");
config.setProtocol("rdp");
return config;
}
public static GuacamoleClientInformation *createGuacamoleClientInformation*
(){
        GuacamoleClientInformation info = new GuacamoleClientInformation();
        info.setOptimalScreenWidth(800);
        info.setOptimalScreenHeight(600);
        info.setOptimalResolution(72);
        return info;
    }
public static InetGuacamoleSocket *createInetGuacamoleSocket*() throws
GuacamoleException{
    return new InetGuacamoleSocket("10.200.200.200", 4822);

    }
public static GuacamoleTunnel *assignGuacamoleTunnel*(final GuacamoleSocket
socket) {
        return new AbstractGuacamoleTunnel() {
            @Override
            public GuacamoleSocket getSocket() {
                return socket;
            }

            @Override
            public UUID getUUID() {
            return UUID.randomUUID();
            }
        };
    }
}


But I get a error, So i add logger at [ *GuacamoleWebSocketTunnelEndpoint*]

@Override
    @OnOpen
    public void onOpen(final Session session, EndpointConfig config) {
    logger.error("into onOpen");
        try {

            // Get tunnel
            tunnel = createTunnel(session, config);
            if (tunnel == null) {
                closeConnection(session,
GuacamoleStatus.RESOURCE_NOT_FOUND);
                return;
            }

        }
        catch (GuacamoleException e) {
            logger.error("Creation of WebSocket tunnel to guacd failed:
{}", e.getMessage());
            logger.debug("Error connecting WebSocket tunnel.", e);
            closeConnection(session, e.getStatus());
            return;
        }

        // Manually register message handler
        session.addMessageHandler(new MessageHandler.Whole<String>() {

            @Override
            public void onMessage(String message) {
                GuacamoleWebSocketTunnelEndpoint.this.onMessage(message);
            }

        });

        // Prepare read transfer thread
        Thread readThread = new Thread() {

            /**
             * Remote (client) side of this connection
             */
            private final RemoteEndpoint.Basic remote =
session.getBasicRemote();

            @Override
            public void run() {
            logger.error("into run");
                StringBuilder buffer = new StringBuilder(BUFFER_SIZE);
                GuacamoleReader reader = tunnel.acquireReader();
                char[] readMessage;

                try {
                logger.error("point 1");

                    String text = null;
                    {
                logger.error("point 1----   a");
                String uuid = tunnel.getUUID().toString();

                logger.error("point 1----   b");
                    String code = GuacamoleTunnel.INTERNAL_DATA_OPCODE;

                    logger.error("point 1----   c");
                    GuacamoleInstruction lab = new
GuacamoleInstruction(code,  uuid);

                    logger.error("point 1----   d");
                    text = lab.toString();

                    logger.error("point 1----   e");
                    }
                    logger.error("remote class : {}", remote.getClass());
                    logger.error("text : {}", text);
                    //tunnel close on this line.
                    remote.sendText(text);
                    logger.error("point 2");
                    try {

                    logger.error("point 3");
                        // Attempt to read
                        while ((readMessage = reader.read()) != null) {

                            // Buffer message
                            buffer.append(readMessage);

                            // Flush if we expect to wait or buffer is
getting full
                            if (!reader.available() || buffer.length() >=
BUFFER_SIZE) {
                                remote.sendText(buffer.toString());
                                buffer.setLength(0);
                            }

                        }
                        logger.error("point 4");
                        // No more data
                        closeConnection(session, GuacamoleStatus.SUCCESS);
                        logger.error("point 5");
                    }

                    // Catch any thrown guacamole exception and attempt
                    // to pass within the WebSocket connection, logging
                    // each error appropriately.
                    catch (GuacamoleClientException e) {
                        logger.error("WebSocket connection terminated: {}",
e.getMessage());
                        logger.error("WebSocket connection terminated due
to client error.", e);
                        closeConnection(session, e.getStatus());
                    }
                    catch (GuacamoleConnectionClosedException e) {
                        logger.error("Connection to guacd closed.", e);
                        closeConnection(session, GuacamoleStatus.SUCCESS);
                    }
                    catch (GuacamoleException e) {
                        logger.error("Connection to guacd terminated
abnormally: {}", e.getMessage());
                        logger.error("Internal error during connection to
guacd.", e);
                        closeConnection(session, e.getStatus());
                    }
                    logger.error("point 6");
                }
                catch (IOException e) {
                    logger.error("I/O error prevents further reads.", e);
                    closeConnection(session, GuacamoleStatus.SERVER_ERROR);
                }catch (Exception e) {
                    logger.error(e.getMessage(), e);
                    closeConnection(session, GuacamoleStatus.SERVER_ERROR);
                }finally {
                logger.error("out run");
                }

            }

        };

        readThread.start();

    }


*Logger content is : *

[11:37:14.552][http-nio-443-exec-7][DEBUG][org.apache.guacamole.net.InetGuacamoleSocket:90]【Connecting
to guacd at 10.200.200.200:4822.】
[11:37:14.571][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.ConfiguredGuacamoleSocket:135]【無connection
ID, 走getProtocal()路線】
[11:37:14.571][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.ConfiguredGuacamoleSocket:141]【最後select_arg的結果
: rdp】
[11:37:14.585][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.ConfiguredGuacamoleSocket:199]【arg_values
: [10.200.200.199, 3389, , admin, P@ssw0rd, , , , , , , , , , , , , , nla,
true, , , , , , , , , , , , , , , , , , , , , , , , , , , , ]】
[11:37:14.614][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.ConfiguredGuacamoleSocket:211]【id
: $f99d685d-ac59-4bd2-b06f-48bce3a3c66b】
[11:37:14.614][http-nio-443-exec-7][ERROR][help.Help$1:54]【into
AbstractGuacamoleTunnel】
[11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:144]【into
run】
[11:37:14.630][Thread-6][ERROR][help.Help$1:68]【into acquireReader】
[11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:150]【point
1】
[11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:154]【point
1----   a】
[11:37:14.630][Thread-6][ERROR][help.Help:59]【into getUUID】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:156]【point
1----   b】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:158]【point
1----   c】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:160]【point
1----   d】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:162]【point
1----   e】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:166]【remote
class : class org.apache.tomcat.websocket.WsRemoteEndpointBasic】
[11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:169]【text
: 0.,36.4045a0fa-c415-473f-938a-ba0b116b86c1;】
[11:37:14.645][http-nio-443-exec-4][ERROR][org.apache.guacamole.websocket.*GuacamoleWebSocketTunnelEndpoint:261]【into
onClose】*
[11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:220]【Deflater
has been closed】
java.lang.NullPointerException: Deflater has been closed
at java.util.zip.Deflater.ensureOpen(Unknown Source) ~[na:1.7.0_79]
at java.util.zip.Deflater.deflate(Unknown Source) ~[na:1.7.0_79]
at
org.apache.tomcat.websocket.PerMessageDeflate.sendMessagePart(PerMessageDeflate.java:345)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:300)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.tomcat.websocket.WsRemoteEndpointImplBase$TextMessageSendHandler.write(WsRemoteEndpointImplBase.java:759)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:252)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:195)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
~[tomcat-websocket.jar:8.0.36]
at
org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint$2.run(GuacamoleWebSocketTunnelEndpoint.java:172)
~[guacamole-common-0.9.13-incubating.jar:na]
[11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:76]【into
closeConnection】
[11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint:223]【out
run】


I don't know why tunnel run close method....


I need help . thanks



On Browser Side JavaScript file (which is named lab.js)



(function(window){
"use strict";
window.lab = {
save : function(key, API){
this[key] = API;
},
exports : function(key){
return this[key];
}
};
}(window));


(function(window, alert, Guacamole, lab){
"use strict";
function create_gua_client( path, place ){
var websocket_tunnel = new Guacamole.WebSocketTunnel(path);
var guac_client = new Guacamole.Client(websocket_tunnel);
var display = document.getElementById( place );

display.appendChild(guac_client.getDisplay().getElement());

guac_client.onerror = function(error) {
alert(error);
};

window.onunload = function() {
guac_client.disconnect();
};

return {
client : guac_client,
play_element : guac_client.getDisplay().getElement(),
root_element : display,
};
}

lab.save("create_gua_client", create_gua_client);
}(window, window.alert, window.Guacamole, window.lab));


(function(window, Guacamole, lab){
"use strict";
function register_mouse( gua_client ){
var mouse = new
Guacamole.Mouse(gua_client.client.getDisplay().getElement());
mouse.onmousedown = mouse.onmouseup = mouse.onmousemove =
function(mouseState) {
gua_client.client.sendMouseState(mouseState);
};
}
lab.save("register_mouse", register_mouse);
}(window, window.Guacamole, window.lab));


(function(window, Guacamole, lab){
"use strict";
function register_keyboard( gua_client ){
var keyboard = new Guacamole.Keyboard(document.getElementById("body"));

keyboard.onkeydown = function(keysym) {
gua_client.client.sendKeyEvent(1, keysym);
return true;
};

keyboard.onkeyup = function(keysym) {
gua_client.client.sendKeyEvent(0, keysym);
return true;
};
}
lab.save("register_keyboard", register_keyboard);
}(window, window.Guacamole, window.lab));


(function(window, Guacamole, lab){
"use strict";
function register_touch_screen( gua_client ){
var touchScreen = new Guacamole.Mouse.Touchscreen(gua_client.play_element);
touchScreen.onmousedown =
touchScreen.onmousemove =
touchScreen.onmouseup = function(mouseState) {
gua_client.client.sendMouseState(mouseState);
};
}
lab.save("register_touch_screen", register_touch_screen);
}(window, window.Guacamole, window.lab));




(function(window, $, Guacamole, lab){
"use strict";
function register_on_screen_keyboard( gua_client ){
var keyboard = new Guacamole.OnScreenKeyboard(lab.keyJson);


keyboard.onkeydown = function(keysym) {
gua_client.client.sendKeyEvent(1, keysym);
return true;
};

keyboard.onkeyup = function(keysym) {
gua_client.client.sendKeyEvent(0, keysym);
return true;
};


$(".osk").bind("blur", function(){
keyboard.reset();
});

  $(".osk").append(keyboard.getElement());

  keyboard.resize(600);

}
lab.save("register_on_screen_keyboard", register_on_screen_keyboard);
}(window, window.$, window.Guacamole, window.lab));


(function(window, Guacamole, lab){
"use strict";
function connect( gua_client, query_string ){
gua_client.client.connect(query_string);

}
lab.save("connect", connect);
}(window, window.Guacamole, window.lab));


(function(window, Guacamole, lab){
"use strict";

var create_gua_client = lab.exports("create_gua_client");
var register_mouse = lab.exports("register_mouse");
var register_keyboard = lab.exports("register_keyboard");
var register_touch_screen = lab.exports("register_touch_screen");
var register_on_screen_keyboard =
lab.exports("register_on_screen_keyboard");
var connect = lab.exports("connect");

function start( path, place ){
var client = create_gua_client(path, place);
register_mouse(client);
register_keyboard(client);
register_touch_screen(client);
register_on_screen_keyboard(client);
connect(client, "anQueryString");
}
lab.save("start", start);
}(window, window.Guacamole, window.lab));


*Html code is*

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel=stylesheet type="text/css" href="./css/core/guacamole.css">
<style>
.resize-sensor {
height: 100%;
    width: 100%;
    position: absolute;
    left: 0;
    top: 0;
    overflow: hidden;
    border: none;
}
</style>
</head>
<body id="body">
<!-- style="width:600px;height:480px;overflow: auto;" -->
<div style="margin:50px 0 0 50px;">
<div id="displayPlace" ></div>
</div>
<div style="margin:50px 0 0 50px;">
<div class="osk" style="width:600px;"> </div>
</div>
</body>


<script type="text/javascript" src="./js/core/all.js"></script>
<script type="text/javascript"
src="./js/third/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="./js/rd2/lab.js"></script>
<script type="text/javascript" src="./js/rd2/lab_depend.js"></script>

<script type="text/javascript">
(function(window, lab){
var start = lab.exports("start");
$(function(){
start("test_Tunnel", "displayPlace");
});

}(window, window.lab));
</script>


</html>



Thanks.

Re: I need help.

Posted by Mike Jumper <mi...@guac-dev.org>.
Could you upload the source for what you're working with somewhere that you
could link to (GitHub, etc.)? The code provided is extremely difficult to
read.

- Mike

On Dec 28, 2017 22:30, "Go Target" <wa...@gmail.com> wrote:

> Dear :
>
> I created a lab. I am using sample code :
>
> public class DemoServlet extends GuacamoleHTTPTunnelServlet {
> private static final long serialVersionUID = 1L;
> private final Logger logger = LoggerFactory.getLogger(DemoServlet.class);
> public static SimpleGuacamoleTunnel tunnel = null;
> @Override
> protected GuacamoleTunnel doConnect(HttpServletRequest request) throws
> GuacamoleException{
> try {
> if( tunnel == null) {
> tunnel = inner();
> }
> return tunnel;
> }catch(GuacamoleException e) {
> logger.error(e.getMessage(), e);
> throw e;
> }catch(Exception e) {
> logger.error(e.getMessage(), e);
> throw e;
> }
> }
> private static SimpleGuacamoleTunnel inner() throws GuacamoleException{
> GuacamoleConfiguration config = new GuacamoleConfiguration();
> config.setProtocol("rdp");
> config.setParameter("hostname", "10.200.200.199");
> config.setParameter("port", "3389");
> config.setParameter("security", "nla");
> config.setParameter("username", "admin");
> config.setParameter("password", "P@ssw0rd");
> config.setParameter("ignore-cert", "true");
> config.setParameter("enable-drive", "true");
> config.setParameter("drive-path", "/home/guacdshare");
> config.setParameter("recording-path", "/anchor_dvr");
> config.setParameter("create-recording-path", "true");
> config.setParameter("recording-name", "test.guac");
> InetGuacamoleSocket inet_socket = new InetGuacamoleSocket("10.200.
> 200.200",
> 4822);
> GuacamoleSocket socket = new ConfiguredGuacamoleSocket(
> inet_socket,config);
> return new SimpleGuacamoleTunnel(socket);
> }
> }
>
>
> It is ok.  I can connet to target from browser.
>
>
> Next, I try to extends【GuacamoleWebSocketTunnelEndpoint】
>
> @ServerEndpoint ("/test_Tunnel")
> public class DemoEndPoint extends GuacamoleWebSocketTunnelEndpoint {
> @Override
> protected GuacamoleTunnel createTunnel(Session arg0, EndpointConfig arg1)
> throws GuacamoleException {
> *GuacamoleConfiguration target_config =
> Help.createGuacamoleConfiguration();*
> * GuacamoleClientInformation browser_config = **Help*
> *.createGuacamoleClientInformation();*
> * GuacamoleSocket gua_server_socket = **Help**.
> createInetGuacamoleSocket();*
> * ConfiguredGuacamoleSocket socket = new ConfiguredGuacamoleSocket(
> gua_server_socket, target_config, browser_config);*
> * GuacamoleTunnel tunnel = **Help**.assignGuacamoleTunnel(socket);*
> * return tunnel;*
> }
> }
>
>
>
> public class *Help*{
> public static GuacamoleConfiguration *createGuacamoleConfiguration*(){
> GuacamoleConfiguration config = new GuacamoleConfiguration();
> config.setParameter("port", "3389");
> config.setParameter("username", "admin");
> config.setParameter("hostname", "10.200.200.199");
> config.setParameter("ignore-cert", "true");
> config.setParameter("security", "nla");
> config.setParameter("password", "P@ssw0rd");
> config.setProtocol("rdp");
> return config;
> }
> public static GuacamoleClientInformation *createGuacamoleClientInformati
> on*
> (){
>         GuacamoleClientInformation info = new GuacamoleClientInformation();
>         info.setOptimalScreenWidth(800);
>         info.setOptimalScreenHeight(600);
>         info.setOptimalResolution(72);
>         return info;
>     }
> public static InetGuacamoleSocket *createInetGuacamoleSocket*() throws
> GuacamoleException{
>     return new InetGuacamoleSocket("10.200.200.200", 4822);
>
>     }
> public static GuacamoleTunnel *assignGuacamoleTunnel*(final GuacamoleSocket
> socket) {
>         return new AbstractGuacamoleTunnel() {
>             @Override
>             public GuacamoleSocket getSocket() {
>                 return socket;
>             }
>
>             @Override
>             public UUID getUUID() {
>             return UUID.randomUUID();
>             }
>         };
>     }
> }
>
>
> But I get a error, So i add logger at [ *GuacamoleWebSocketTunnelEndpoi
> nt*]
>
> @Override
>     @OnOpen
>     public void onOpen(final Session session, EndpointConfig config) {
>     logger.error("into onOpen");
>         try {
>
>             // Get tunnel
>             tunnel = createTunnel(session, config);
>             if (tunnel == null) {
>                 closeConnection(session,
> GuacamoleStatus.RESOURCE_NOT_FOUND);
>                 return;
>             }
>
>         }
>         catch (GuacamoleException e) {
>             logger.error("Creation of WebSocket tunnel to guacd failed:
> {}", e.getMessage());
>             logger.debug("Error connecting WebSocket tunnel.", e);
>             closeConnection(session, e.getStatus());
>             return;
>         }
>
>         // Manually register message handler
>         session.addMessageHandler(new MessageHandler.Whole<String>() {
>
>             @Override
>             public void onMessage(String message) {
>                 GuacamoleWebSocketTunnelEndpoint.this.onMessage(message);
>             }
>
>         });
>
>         // Prepare read transfer thread
>         Thread readThread = new Thread() {
>
>             /**
>              * Remote (client) side of this connection
>              */
>             private final RemoteEndpoint.Basic remote =
> session.getBasicRemote();
>
>             @Override
>             public void run() {
>             logger.error("into run");
>                 StringBuilder buffer = new StringBuilder(BUFFER_SIZE);
>                 GuacamoleReader reader = tunnel.acquireReader();
>                 char[] readMessage;
>
>                 try {
>                 logger.error("point 1");
>
>                     String text = null;
>                     {
>                 logger.error("point 1----   a");
>                 String uuid = tunnel.getUUID().toString();
>
>                 logger.error("point 1----   b");
>                     String code = GuacamoleTunnel.INTERNAL_DATA_OPCODE;
>
>                     logger.error("point 1----   c");
>                     GuacamoleInstruction lab = new
> GuacamoleInstruction(code,  uuid);
>
>                     logger.error("point 1----   d");
>                     text = lab.toString();
>
>                     logger.error("point 1----   e");
>                     }
>                     logger.error("remote class : {}", remote.getClass());
>                     logger.error("text : {}", text);
>                     //tunnel close on this line.
>                     remote.sendText(text);
>                     logger.error("point 2");
>                     try {
>
>                     logger.error("point 3");
>                         // Attempt to read
>                         while ((readMessage = reader.read()) != null) {
>
>                             // Buffer message
>                             buffer.append(readMessage);
>
>                             // Flush if we expect to wait or buffer is
> getting full
>                             if (!reader.available() || buffer.length() >=
> BUFFER_SIZE) {
>                                 remote.sendText(buffer.toString());
>                                 buffer.setLength(0);
>                             }
>
>                         }
>                         logger.error("point 4");
>                         // No more data
>                         closeConnection(session, GuacamoleStatus.SUCCESS);
>                         logger.error("point 5");
>                     }
>
>                     // Catch any thrown guacamole exception and attempt
>                     // to pass within the WebSocket connection, logging
>                     // each error appropriately.
>                     catch (GuacamoleClientException e) {
>                         logger.error("WebSocket connection terminated: {}",
> e.getMessage());
>                         logger.error("WebSocket connection terminated due
> to client error.", e);
>                         closeConnection(session, e.getStatus());
>                     }
>                     catch (GuacamoleConnectionClosedException e) {
>                         logger.error("Connection to guacd closed.", e);
>                         closeConnection(session, GuacamoleStatus.SUCCESS);
>                     }
>                     catch (GuacamoleException e) {
>                         logger.error("Connection to guacd terminated
> abnormally: {}", e.getMessage());
>                         logger.error("Internal error during connection to
> guacd.", e);
>                         closeConnection(session, e.getStatus());
>                     }
>                     logger.error("point 6");
>                 }
>                 catch (IOException e) {
>                     logger.error("I/O error prevents further reads.", e);
>                     closeConnection(session, GuacamoleStatus.SERVER_ERROR);
>                 }catch (Exception e) {
>                     logger.error(e.getMessage(), e);
>                     closeConnection(session, GuacamoleStatus.SERVER_ERROR);
>                 }finally {
>                 logger.error("out run");
>                 }
>
>             }
>
>         };
>
>         readThread.start();
>
>     }
>
>
> *Logger content is : *
>
> [11:37:14.552][http-nio-443-exec-7][DEBUG][org.apache.guacamole.net.
> InetGuacamoleSocket:90]【Connecting
> to guacd at 10.200.200.200:4822.】
> [11:37:14.571][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.
> ConfiguredGuacamoleSocket:135]【無connection
> ID, 走getProtocal()路線】
> [11:37:14.571][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.
> ConfiguredGuacamoleSocket:141]【最後select_arg的結果
> : rdp】
> [11:37:14.585][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.
> ConfiguredGuacamoleSocket:199]【arg_values
> : [10.200.200.199, 3389, , admin, P@ssw0rd, , , , , , , , , , , , , , nla,
> true, , , , , , , , , , , , , , , , , , , , , , , , , , , , ]】
> [11:37:14.614][http-nio-443-exec-7][ERROR][org.apache.guacamole.protocol.
> ConfiguredGuacamoleSocket:211]【id
> : $f99d685d-ac59-4bd2-b06f-48bce3a3c66b】
> [11:37:14.614][http-nio-443-exec-7][ERROR][help.Help$1:54]【into
> AbstractGuacamoleTunnel】
> [11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:144]【into
> run】
> [11:37:14.630][Thread-6][ERROR][help.Help$1:68]【into acquireReader】
> [11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:150]【point
> 1】
> [11:37:14.630][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:154]【point
> 1----   a】
> [11:37:14.630][Thread-6][ERROR][help.Help:59]【into getUUID】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:156]【point
> 1----   b】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:158]【point
> 1----   c】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:160]【point
> 1----   d】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:162]【point
> 1----   e】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:166]【remote
> class : class org.apache.tomcat.websocket.WsRemoteEndpointBasic】
> [11:37:14.645][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:169]【text
> : 0.,36.4045a0fa-c415-473f-938a-ba0b116b86c1;】
> [11:37:14.645][http-nio-443-exec-4][ERROR][org.apache.
> guacamole.websocket.*GuacamoleWebSocketTunnelEndpoint:261]【into
> onClose】*
> [11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:220]【Deflater
> has been closed】
> java.lang.NullPointerException: Deflater has been closed
> at java.util.zip.Deflater.ensureOpen(Unknown Source) ~[na:1.7.0_79]
> at java.util.zip.Deflater.deflate(Unknown Source) ~[na:1.7.0_79]
> at
> org.apache.tomcat.websocket.PerMessageDeflate.sendMessagePart(
> PerMessageDeflate.java:345)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(
> WsRemoteEndpointImplBase.java:300)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.tomcat.websocket.WsRemoteEndpointImplBase$
> TextMessageSendHandler.write(WsRemoteEndpointImplBase.java:759)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(
> WsRemoteEndpointImplBase.java:252)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(
> WsRemoteEndpointImplBase.java:195)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(
> WsRemoteEndpointBasic.java:37)
> ~[tomcat-websocket.jar:8.0.36]
> at
> org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint$2.run(
> GuacamoleWebSocketTunnelEndpoint.java:172)
> ~[guacamole-common-0.9.13-incubating.jar:na]
> [11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:76]【into
> closeConnection】
> [11:37:14.661][Thread-6][ERROR][org.apache.guacamole.websocket.
> GuacamoleWebSocketTunnelEndpoint:223]【out
> run】
>
>
> I don't know why tunnel run close method....
>
>
> I need help . thanks
>
>
>
> On Browser Side JavaScript file (which is named lab.js)
>
>
>
> (function(window){
> "use strict";
> window.lab = {
> save : function(key, API){
> this[key] = API;
> },
> exports : function(key){
> return this[key];
> }
> };
> }(window));
>
>
> (function(window, alert, Guacamole, lab){
> "use strict";
> function create_gua_client( path, place ){
> var websocket_tunnel = new Guacamole.WebSocketTunnel(path);
> var guac_client = new Guacamole.Client(websocket_tunnel);
> var display = document.getElementById( place );
>
> display.appendChild(guac_client.getDisplay().getElement());
>
> guac_client.onerror = function(error) {
> alert(error);
> };
>
> window.onunload = function() {
> guac_client.disconnect();
> };
>
> return {
> client : guac_client,
> play_element : guac_client.getDisplay().getElement(),
> root_element : display,
> };
> }
>
> lab.save("create_gua_client", create_gua_client);
> }(window, window.alert, window.Guacamole, window.lab));
>
>
> (function(window, Guacamole, lab){
> "use strict";
> function register_mouse( gua_client ){
> var mouse = new
> Guacamole.Mouse(gua_client.client.getDisplay().getElement());
> mouse.onmousedown = mouse.onmouseup = mouse.onmousemove =
> function(mouseState) {
> gua_client.client.sendMouseState(mouseState);
> };
> }
> lab.save("register_mouse", register_mouse);
> }(window, window.Guacamole, window.lab));
>
>
> (function(window, Guacamole, lab){
> "use strict";
> function register_keyboard( gua_client ){
> var keyboard = new Guacamole.Keyboard(document.getElementById("body"));
>
> keyboard.onkeydown = function(keysym) {
> gua_client.client.sendKeyEvent(1, keysym);
> return true;
> };
>
> keyboard.onkeyup = function(keysym) {
> gua_client.client.sendKeyEvent(0, keysym);
> return true;
> };
> }
> lab.save("register_keyboard", register_keyboard);
> }(window, window.Guacamole, window.lab));
>
>
> (function(window, Guacamole, lab){
> "use strict";
> function register_touch_screen( gua_client ){
> var touchScreen = new Guacamole.Mouse.Touchscreen(
> gua_client.play_element);
> touchScreen.onmousedown =
> touchScreen.onmousemove =
> touchScreen.onmouseup = function(mouseState) {
> gua_client.client.sendMouseState(mouseState);
> };
> }
> lab.save("register_touch_screen", register_touch_screen);
> }(window, window.Guacamole, window.lab));
>
>
>
>
> (function(window, $, Guacamole, lab){
> "use strict";
> function register_on_screen_keyboard( gua_client ){
> var keyboard = new Guacamole.OnScreenKeyboard(lab.keyJson);
>
>
> keyboard.onkeydown = function(keysym) {
> gua_client.client.sendKeyEvent(1, keysym);
> return true;
> };
>
> keyboard.onkeyup = function(keysym) {
> gua_client.client.sendKeyEvent(0, keysym);
> return true;
> };
>
>
> $(".osk").bind("blur", function(){
> keyboard.reset();
> });
>
>   $(".osk").append(keyboard.getElement());
>
>   keyboard.resize(600);
>
> }
> lab.save("register_on_screen_keyboard", register_on_screen_keyboard);
> }(window, window.$, window.Guacamole, window.lab));
>
>
> (function(window, Guacamole, lab){
> "use strict";
> function connect( gua_client, query_string ){
> gua_client.client.connect(query_string);
>
> }
> lab.save("connect", connect);
> }(window, window.Guacamole, window.lab));
>
>
> (function(window, Guacamole, lab){
> "use strict";
>
> var create_gua_client = lab.exports("create_gua_client");
> var register_mouse = lab.exports("register_mouse");
> var register_keyboard = lab.exports("register_keyboard");
> var register_touch_screen = lab.exports("register_touch_screen");
> var register_on_screen_keyboard =
> lab.exports("register_on_screen_keyboard");
> var connect = lab.exports("connect");
>
> function start( path, place ){
> var client = create_gua_client(path, place);
> register_mouse(client);
> register_keyboard(client);
> register_touch_screen(client);
> register_on_screen_keyboard(client);
> connect(client, "anQueryString");
> }
> lab.save("start", start);
> }(window, window.Guacamole, window.lab));
>
>
> *Html code is*
>
> <!DOCTYPE HTML>
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
> <link rel=stylesheet type="text/css" href="./css/core/guacamole.css">
> <style>
> .resize-sensor {
> height: 100%;
>     width: 100%;
>     position: absolute;
>     left: 0;
>     top: 0;
>     overflow: hidden;
>     border: none;
> }
> </style>
> </head>
> <body id="body">
> <!-- style="width:600px;height:480px;overflow: auto;" -->
> <div style="margin:50px 0 0 50px;">
> <div id="displayPlace" ></div>
> </div>
> <div style="margin:50px 0 0 50px;">
> <div class="osk" style="width:600px;"> </div>
> </div>
> </body>
>
>
> <script type="text/javascript" src="./js/core/all.js"></script>
> <script type="text/javascript"
> src="./js/third/jquery-3.2.1.min.js"></script>
> <script type="text/javascript" src="./js/rd2/lab.js"></script>
> <script type="text/javascript" src="./js/rd2/lab_depend.js"></script>
>
> <script type="text/javascript">
> (function(window, lab){
> var start = lab.exports("start");
> $(function(){
> start("test_Tunnel", "displayPlace");
> });
>
> }(window, window.lab));
> </script>
>
>
> </html>
>
>
>
> Thanks.
>