Reputation: 23
I'm trying to use websockets within my local Glassfish 3.1.2 server installation. I'm using Grizzly 2.2 in my Maven project :
<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);
}
}
VideoSharingWebSocket.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);
}
}
}
}
I enabled websockets support in Glassfish with this command :
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true
Client code, 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;
I'm testing this in Chrome 18.0.1025.165 in a Mac. At page loading I get this error :
Unexpected response code: 405
In the server logs there is no error and only my "registering" (WebSocketsServlet) log is displayed.
Do you have any suggestion ?
Thank you in advance.
Best regards.
Upvotes: 2
Views: 4364
Reputation: 985
GlassFish 3.1.2 uses Grizzly 1.9.46. Grizzly 2.x is incompatible with that version of GlassFish. You'll need to use the 1.9.46 or later versions of 1.9 with 3.1.2.
Upvotes: 1