Michael Miner
Michael Miner

Reputation: 964

WebSocket OnMessage and ServerEndpoint

I have been reading up on the WebSocket api and have been playing around with it a little bit but I can not get my head wrapped around a few things. Right now I have a servlet TestServlet which is defined in web.xml to trigger the doGet method every time the URL localhost:TestServlet is put into the URL of a browser.

I want to wait for a connection from a mobile device, the guy building the phone app says they can load my servlet, in which case the doGet method would trigger and I would do my business with the data received. Only issue is that in the doGet method I have the request and the response, can I get the data sting sent from the phone from the request?

I also have my @ServerEndpoint set to /* which I think means the servlet will be active when a url containing /TestServlet is loaded. Problem here is I do not see any output from print lines or see any breakpoints hit.

I am just wondering (if this makes any sense) having the @ServerEndpoint set as @ServerEndpoint(value = "/*") will the method annotated @OnMessage trigger if a message is there to receive?

If not how can I make it trigger, and if I can not how can I get a data string from an HttpServletRequest?

Upvotes: 2

Views: 1688

Answers (1)

BalusC
BalusC

Reputation: 1108782

You're mixing basic concepts. The @ServerEndpoint(value) does not represent an URL pattern like @WebServlet(urlPatterns). It represents the URI or URI template. The value of /* is just plain wrong. You should not think of it as a servlet (filter). It is not "automagically" invoked on certain http:// requests either. The client has to explicitly fire a ws:// request by a.o. new WebSocket(uri) in JavaScript (assuming a web application).

E.g.

@ServerEndpoint("/push")
public class Push {}

with

if (window.WebSocket) {
    var ws = new WebSocket("ws://example.com/contextname/push");
    ws.onmessage = function(event) {
        var text = event.data;
        console.log(text);
    };
}
else {
    // Bad luck. Browser doesn't support it. Consider falling back to long polling.
    // See http://caniuse.com/websockets for an overview of supported browsers.
    // There exist jQuery WebSocket plugins with transparent fallback.
}

See also:


Update: it turns out to be a true mobile app (Android/iOS). If the (native) URL/HTTP connection library being used to connect the Servlet by http:// does not support the ws:// protocol, then you'd best look for a 3rd party library supporting that. To find one, use keywords "android websocket client", or "ios websocket client". Note: in documentation/tutorials/blogs, pay attention to the "client" part, not the "server" part, because the "server" part is already implemented by @ServerEndpoint.

Upvotes: 1

Related Questions