Веб-сокеты с Glassfish 3.1.2 и Grizzly — Неожиданный код ответа: 405

Я пытаюсь использовать веб-сокеты в моей локальной установке сервера Glassfish 3.1.2. Я использую Grizzly 2.2 в своем проекте Maven:

<dependency>
  <groupId>org.glassfish.grizzly</groupId>
  <artifactId>grizzly-websockets</artifactId>
  <version>2.2</version>
</dependency>

WebSocketsServlet.java

import org.glassfish.grizzly.Grizzly;
import java.util.logging.Logger;
import org.glassfish.grizzly.websockets.WebSocketEngine;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class WebSocketsServlet extends HttpServlet {

    private static final Logger logger = Grizzly.logger(WebSocketsServlet.class);
    private final VideoSharingApplication app = new VideoSharingApplication();

    @Override
    public void init(ServletConfig config) throws ServletException {
        logger.log(Level.SEVERE, "registering");
        WebSocketEngine.getEngine().register(config.getServletContext().getContextPath() + "/videosharing", app);
    }

    @Override
    public void destroy() {
        WebSocketEngine.getEngine().unregister(app);
    }
}

Видеошарингвебсокет.java

import java.util.logging.Logger;
import org.glassfish.grizzly.websockets.DefaultWebSocket;
import org.glassfish.grizzly.websockets.ProtocolHandler;
import org.glassfish.grizzly.websockets.WebSocketListener;
import org.glassfish.grizzly.Grizzly;

public class VideoSharingWebSocket extends DefaultWebSocket {

    private static final Logger logger = Grizzly.logger(VideoSharingWebSocket.class);

    public VideoSharingWebSocket(ProtocolHandler handler, WebSocketListener... listeners) {
        super(handler, listeners);
    }

}

VideoSharingApplication.java

import java.util.logging.Level;
import java.util.logging.Logger;
import org.glassfish.grizzly.Grizzly;
import org.glassfish.grizzly.websockets.ProtocolHandler;
import org.glassfish.grizzly.websockets.WebSocket;
import org.glassfish.grizzly.websockets.WebSocketApplication;
import org.glassfish.grizzly.websockets.WebSocketListener;

import org.glassfish.grizzly.http.HttpRequestPacket;

public class VideoSharingApplication extends WebSocketApplication {

    private static final Logger logger = Grizzly.logger(VideoSharingApplication.class);

    @Override
    public WebSocket createSocket(ProtocolHandler handler, WebSocketListener... listeners) {
        logger.log(Level.SEVERE, "createSocket");
        return new VideoSharingWebSocket(handler, listeners);
    }

    @Override
    public boolean isApplicationRequest(HttpRequestPacket request) {
        logger.log(Level.SEVERE, "isApplicationRequest");
        return "/videosharing".equals(request.getRequestURI());
    }

    @Override
    public void onMessage(WebSocket socket, String data) {
        logger.log(Level.SEVERE, "onMessage");
        for (WebSocket webSocket : getWebSockets()) {
            if (socket != webSocket) {
                webSocket.send(data);
            }
        }
    }
}

Я включил поддержку веб-сокетов в Glassfish с помощью этой команды:

asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true

Код клиента, app.js:

var network = function () {
    return {
        initialize: function() {
            var url = 'ws://localhost:8080/monApp/videosharing';
            var websocket = new WebSocket(url);
            websocket.name = APP.id;
            websocket.onopen = function(evt) {
                alert('onopen');
            };
            websocket.onerror = function(evt) {
                alert('onerror');
            };
            websocket.onmessage = function (evt) {
                alert('onmessage');
                var command = JSON.parse(evt.data);
                if (command.type == "pause") {
                    APP.pauseVideo();
                } else if (command.type == "play") {
                    APP.playVideo();
                } else if (command.type == "seeked") {
                    APP.seekVideo(command.currentTime);
                } else {
                    alert("Unknown command " + command);
                }
            };
            websocket.onclose = function()
            {
                alert('onclose');
            };
        },
        send: function(command) {
            websocket.send(command);
        }
    }
};

var APP = {
    id: Math.floor(Math.random() * 10000),

    network: network(),

    // Cannot use 'this' here after updating window.onload (see below)
    initialize: function () {
        APP.network.initialize();
        var video = APP.getVideo();
        video.addEventListener('play', 
            function (event) {
                alert('play');
                var command = { type: "play" };
                APP.network.send(JSON.stringify(command));
            },
            false);
        video.addEventListener('pause',
            function (event) {
                alert('pause');
                var command = { type: "pause" };
                APP.network.send(JSON.stringify(command));
            },
            false);
        video.addEventListener('seeked',
            function (event) {
                alert('seeked');
                var command = { type: "seeked",
                                currentTime: APP.getVideo().currentTime };
                APP.network.send(JSON.stringify(command));
            },
            false);
    },

    getVideo: function () {
        return document.getElementsByTagName("video")[0];
    },

    pauseVideo: function () {
        var video = this.getVideo();
        video.pause();
    },

    playVideo: function () {
        var video = this.getVideo();
        video.play();
    },

    seekVideo: function (currentTime) {
        var video = this.getVideo();
        video.currentTime = currentTime;
    }

};

window.onload = APP.initialize;

Я тестирую это в Chrome 18.0.1025.165 на Mac. При загрузке страницы я получаю эту ошибку:

Unexpected response code: 405

В логах сервера ошибки нет и отображается только мой лог "регистрации" (WebSocketsServlet).

У вас есть какие-либо предложения ?

Заранее спасибо.

С наилучшими пожеланиями.


person Yiseli    schedule 01.05.2012    source источник
comment
Вы проверяли эти? stackoverflow.com/questions/9964716/ (особенно часть конфигурации Glassfish)   -  person ndeverge    schedule 01.05.2012


Ответы (1)


GlassFish 3.1.2 использует Grizzly 1.9.46. Grizzly 2.x несовместим с этой версией GlassFish. Вам нужно будет использовать 1.9.46 или более поздние версии 1.9 с 3.1.2.

person rlubke    schedule 01.05.2012
comment
Он отлично работает с grizzly-websockets 1.9.46 jar и GlassFish 3.1.2. Какую версию grizzly-websockets мне следует использовать для работы с GlassFish 3.1 и последними версиями браузеров? - person Yiseli; 02.05.2012
comment
Я бы не рекомендовал использовать GlassFish 3.1. GlassFish 3.1.2 имеет последний код WS и поддерживает RFC 6455. Версии до 3.1.2 устарели и не могут быть легко обновлены. - person rlubke; 02.05.2012
comment
сейчас я использую GlassFish 3.1 и grizzly-websockets 2.3-rc3. так оба совместимы для webscoket? - person Kamlesh; 14.02.2013