我已经使用GWT和Java编写了Google Channel API的客户机/服务器实现。我在互联网上和API频道上到处找过,想知道如何在你使用完频道后关闭它(每个用户一次只能打开一个频道,所以这对我的应用程序非常重要),但到目前为止,我什么也没找到。
有人知道如何向谷歌发送关闭套接字请求以关闭某个频道的套接字吗?
显然,互联网上没有人知道(或需要知道)如何做到这一点,所以我只是盯着API概述看了足够长的时间,直到它出现。秘密在于API的Javascript部分,当你创建"socket"变量时。Javascript API声明套接字var还有一个"close()"函数。考虑到我是用Java编写实现的,这让我有点棘手,因为我必须深入了解JSNI的知识,而套接字var只存在于我的"加入"调用期间。
为了解决这个问题,我从套接字变量中创建了一个全局变量,在本例中称为"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();
}-*/;