我正在尝试使用Dropwizard 0.7.0框架实现一个长轮询服务器。我被建议使用码头集成。经过一些谷歌搜索,我真的很困惑像websockets,jetty continuation,cometd。
我的问题是,这些东西是什么,我应该选择哪一个?任何一个例子都非常感谢!
被修改
我们的服务器有很多客户端,包括移动(ios,android),个人电脑和网络。 websocket只能在网络浏览器中使用吗?
答案 0 :(得分:3)
Websocket可在您列出的所有客户端中使用。 通常像Atmoshphere这样的框架会降级到其他类型的传输(例如longpolling而不是websockets),并为你抽象出差异。 Websockets是长轮询试图解决的事情的标准 - 即服务器端推送。
我已在jetty上为Dropwizard 0.7.0完成了websockets - 但是读了我在DW google组中链接到的线程。
参见http://www.eclipse.org/jetty/documentation/9.0.6.v20130930/websockets.html 和https://groups.google.com/d/msg/dropwizard-user/doNCx_35urk/5PIvd8_NHIcJ
基本上你将一个websocket-servlet添加到DW,它协商一个websocket会话:
final ServletRegistration.Dynamic websocket = environment.servlets().addServlet(
"websocket",
new MyWebSocketServlet(
environment.getObjectMapper(),
environment.metrics(),
configuration.getKafkaConfig()
)
);
websocket.setAsyncSupported(true);
websocket.addMapping("/websocket/*");
websocket servlet:
public class MyWebSocketServlet extends WebSocketServlet{
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(MyWebSocketEndpoint.class);
}
}
最后是你的终端由jetty websocket libs实现:
@WebSocket
public class MyWebSocketEndpoint {
@OnWebSocketMessage
public void onMessage(Session session, String s) throws IOException {
session.getRemote().sendString("Returned; "+s);
}
}
答案 1 :(得分:0)
如果你想遵循JSR-356 websockets标准,你可以使用这两个Dropwizard包中的一个:
为了支持websockets指标(计算消息,开放会话,会话持续时间统计等等),我写了第二个。
示例:
<dependency>
<groupId>com.liveperson</groupId>
<artifactId>dropwizard-websocket</artifactId>
<version>XXX</version>
</dependency>
然后:
public void initialize(Bootstrap<Configuration> bootstrap) {
bootstrap.addBundle(new WebsocketBundle(AnnotatedEchoServer.class));
}
@Metered
@Timed
@ExceptionMetered
@ServerEndpoint("/annotated-ws")
public static class AnnotatedEchoServer {
@OnOpen
public void myOnOpen(final Session session) throws IOException {
session.getAsyncRemote().sendText("welcome");
}
@OnMessage
public void myOnMsg(final Session session, String message) {
session.getAsyncRemote().sendText(message.toUpperCase());
}
@OnClose
public void myOnClose(final Session session, CloseReason cr) {
}
}