WebSocket OnMessage 和 ServerEndpoint

WebSocket OnMessage and ServerEndpoint

我一直在阅读 WebSocket api 并且一直在尝试它,但我无法全神贯注于一些事情。现在我有一个 servlet TestServlet,它在 web.xml 中定义,每次将 URL localhost:TestServlet 放入 URL 时触发 doGet 方法] 的浏览器。

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

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

我只是想知道(如果这有意义的话)将 @ServerEndpoint 设置为 @ServerEndpoint(value = "/*") 是否会在消息存在时触发注释为 @OnMessage 的方法受到?

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

您正在混淆基本概念。 @ServerEndpoint(value) 不代表像 @WebServlet(urlPatterns) 这样的 URL 模式。它代表了URI or URI template/* 的值完全错误。您不应将其视为 servlet(过滤器)。它也不会 "automagically" 在某些 http:// 请求上调用。客户端必须通过 a.o 显式触发 ws:// 请求。 new WebSocket(uri) in JavaScript(假设是 Web 应用程序)。

例如

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

另请参阅:

  • Real time updates from database using JSF/Java EE(另一个涉及带有 JavaScript 的 websockets 的具体示例)

更新:原来是一个真正的移动应用程序(Android/iOS)。如果 http:// 用于连接 Servlet 的(本机)URL/HTTP 连接库不支持 ws:// 协议,那么您最好寻找支持该协议的第 3 方库。要找到一个,请使用关键字 "android websocket client", or "ios websocket client"。注意:在documentation/tutorials/blogs中,注意"client"部分,而不是"server"部分,因为"server"部分已经被@ServerEndpoint.[=24实现了=]