분명히 인터넷에서 아무도이 작업을 수행하는 방법을 알아 내지 못 했으므로 API 개요를 오랫동안 보았습니다. 비밀은 "socket"변수를 만들 때 API의 Javascript 부분에 있습니다. Javascript API는 소켓 var도 "close()"함수를 가지고 있다고 말합니다. 내 구현을 자바로 작성한 것을 감안할 때, JSNI에 대한 지식이 부족해져서 "bind"호출 중에 소켓 var가 존재하기 때문에 다소 힘들었다.
이 문제를 해결하기 위해 "globalSocket"이라는 소켓 변수에서 전역 변수를 생성 한 다음 나중에 글로벌 소켓 변수에서 "close()"라고하는 별도의 JSNI 닫기 함수를 작성했습니다. 그 후에 매력처럼 작동했습니다.
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;
[email protected]::onMessage(Ljava/lang/String;)(data);
};
socket.onopen = function() {
[email protected]::onOpen()();
};
socket.onerror = function(error) {
[email protected]::onError(ILjava/lang/String;)(error.code, error.description);
};
socket.onclose = function() {
[email protected]::onClose()();
};
}-*/;
private native void close() /*-{
$wnd.globalSocket.close();
}-*/;