簡體   English   中英

使用Dropwizard 0.7.0實現長輪詢服務器

[英]Implementing long polling server using Dropwizard 0.7.0

我正在嘗試使用Dropwizard 0.7.0框架實現長輪詢服務器。 建議我使用碼頭集成。 經過一番谷歌搜索后,我對websockets,碼頭續航,彗星之類的東西感到非常困惑。

我的問題是,這些東西是什么,我應該選擇哪一個? 任何例子都非常感謝!


已編輯

我們的服務器有許多客戶端,包括移動設備(iOS,Android),PC和Web。 websocket僅在Web瀏覽器中可用嗎?

Websocket在您列出的所有客戶端中都可用。 通常,諸如Atmoshphere之類的框架會處理降級為其他類型的傳輸(例如,使用長輪詢而不是websocket)並為您抽象化差異。 Websockets是長輪詢嘗試解決的問題的標准-即服務器端推送。

我已經完成了Dropwizard 0.7.0的碼頭上的websockets-但在DW google組中我鏈接到的線程上有閱讀。

請參閱http://www.eclipse.org/jetty/documentation/9.0.6.v20130930/websockets.htmlhttps://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);
  }
}

最后是您的端點,這是通過碼頭websocket庫實現的:

@WebSocket
public class MyWebSocketEndpoint {

    @OnWebSocketMessage
    public void onMessage(Session session, String s) throws IOException {
        session.getRemote().sendString("Returned; "+s);
    }

}

如果要遵循JSR-356網絡套接字標准,則可以使用以下兩個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) {
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM