WebSocket OnMessage和ServerEndpoint

时间:2015-01-02 04:34:51

标签: servlets websocket

我一直在阅读WebSocket api并且已经玩了一下但是我无法理解我的头脑。现在我有一个servlet TestServlet,它在web.xml中定义,每次将URL localhost:TestServlet放入浏览器的URL时触发doGet方法。

我想等待来自移动设备的连接,构建手机应用程序的人说他们可以加载我的servlet,在这种情况下doGet方法会触发,我会根据收到的数据开展业务。唯一的问题是,在doGet方法中我有请求和响应,我可以从请求中获取手机发送的数据吗?

我也将@ServerEndpoint设置为/*,我认为这意味着当加载包含/TestServlet的网址时,servlet将处于活动状态。这里的问题是我看不到打印行的任何输出或看到任何断点。

我只是想知道(如果这有任何意义)将@ServerEndpoint设置为@ServerEndpoint(value =" / *")将触发注释@OnMessage的方法有消息可以收到吗?

如果没有,我怎么能让它触发,如果我不能如何从HttpServletRequest获取数据字符串?

1 个答案:

答案 0 :(得分:1)

您正在混合基本概念。 @ServerEndpoint(value)不代表@WebServlet(urlPatterns)之类的网址格式。它代表URI or URI template/*的价值是完全错误的。你不应该把它当作一个servlet(过滤器)。它不是自动化的#34;在某些http://请求上调用。客户端必须通过a.o明确触发ws://请求。 JavaScript中的new WebSocket(uri)(假设是一个Web应用程序)。

E.g。

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

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.
}

另见:


更新:结果证明这是一款真正的移动应用(Android / iOS)。如果http://用于连接Servlet的(本机)URL / HTTP连接库不支持ws://协议,那么您最好寻找支持该协议的第三方库。要查找一个,请使用关键字"android websocket client""ios websocket client"。注意:在文档/教程/博客中,注意"客户端"部分,而不是"服务器"部分,因为"服务器"部分已由@ServerEndpoint实施。