【问题标题】:Closing Channel with Google Channel API使用 Google Channel API 关闭频道
【发布时间】:2014-09-29 07:05:06
【问题描述】:
我使用 GWT 和 Java 编写了 Google Channel API 的客户端/服务器实现。我在 Internet 和 Channel API 中查看了所有内容,以了解如何在使用完 Channel 后关闭它(每个用户一次只能打开一个通道,所以这对我的应用程序非常重要) ,但到目前为止我什么也没找到。
有谁知道如何向 Google 发送关闭套接字请求以关闭某个 Channel 的套接字?
【问题讨论】:
标签:
java
sockets
gwt
channel-api
【解决方案1】:
显然,互联网上没有人知道(或需要弄清楚)如何做到这一点,所以我只是盯着 API 概述看了足够长的时间,直到它出现。当您创建“socket”变量时,秘密就在 API 的 Javascript 部分。 Javascript API 声明套接字变量也有一个“close()”函数。考虑到我是用 Java 编写实现的,这对我来说有点棘手,因为我不得不抹去我对 JSNI 的了解,并且套接字变量只存在于我的“加入”调用期间。
为了解决这个问题,我从套接字变量中创建了一个全局变量,在本例中称为“globalSocket”,然后编写了一个单独的 JSNI 关闭函数,该函数在全局套接字变量上调用了“close()”。之后就像一个魅力一样工作。
private native void join(String channelKey) /*-{
var channel = new $wnd.goog.appengine.Channel(channelKey);
var socket = channel.open();
$wnd.globalSocket = socket;
var self = this;
socket.onmessage = function(evt) {
var data = evt.data;
self.@com.divint.roo.client.Channel::onMessage(Ljava/lang/String;)(data);
};
socket.onopen = function() {
self.@com.divint.roo.client.Channel::onOpen()();
};
socket.onerror = function(error) {
self.@com.divint.roo.client.Channel::onError(ILjava/lang/String;)(error.code, error.description);
};
socket.onclose = function() {
self.@com.divint.roo.client.Channel::onClose()();
};
}-*/;
private native void close() /*-{
$wnd.globalSocket.close();
}-*/;