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实现了=]
我一直在阅读 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实现了=]