자바가있는 akka websocket, 클라이언트 수 계산, 클라이언트에 메시지 보내기

마이크

나는 websocket 서버를 만들기 위해 akka java websocket 자습서를 따르고 있습니다. 두 가지 추가 기능을 구현하고 싶습니다.

  • 연결된 클라이언트의 수를 표시 할 수 있지만 동시에 연결된 클라이언트가 100 개라는 것을 알고 있어도 결과는 항상 0 또는 1입니다.
  • Websocket 통신은 양방향입니다. 현재 서버는 클라이언트가 메시지를 보낼 때만 메시지로 응답합니다. 서버에서 클라이언트로 메시지 보내기를 시작하려면 어떻게해야합니까?

다음은 내 클라이언트 계산 구현을 최소한으로 수정 한 원본 akka Java 서버 예제 코드입니다.

public class websocketServer {
private static AtomicInteger connections = new AtomicInteger(0);//connected clients count.

public static class MyTimerTask extends TimerTask {
//called every second to display number of connected clients.
    @Override
    public void run() {
        System.out.println("Conncurrent connections: " + connections);
    }
}


//#websocket-handling
  public static HttpResponse handleRequest(HttpRequest request) {
      HttpResponse result;
      connections.incrementAndGet();
      if (request.getUri().path().equals("/greeter")) {
          final Flow<Message, Message, NotUsed> greeterFlow = greeter();
          result = WebSocket.handleWebSocketRequestWith(request, greeterFlow);
      } else {
          result = HttpResponse.create().withStatus(413); 
      }
      connections.decrementAndGet();
      return result;
  }


public static void main(String[] args) throws Exception {
    ActorSystem system = ActorSystem.create();
    TimerTask timerTask = new MyTimerTask();
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(timerTask, 0, 1000);
    try {
      final Materializer materializer = ActorMaterializer.create(system);

      final Function<HttpRequest, HttpResponse> handler = request -> handleRequest(request);
      CompletionStage<ServerBinding> serverBindingFuture =
        Http.get(system).bindAndHandleSync(
          handler, ConnectHttp.toHost("****", 1183), materializer);


      // will throw if binding fails
      serverBindingFuture.toCompletableFuture().get(1, TimeUnit.SECONDS);
      System.out.println("Press ENTER to stop.");
      new BufferedReader(new InputStreamReader(System.in)).readLine();
      timer.cancel();
    } catch (Exception e){
        e.printStackTrace();
    }
    finally {
      system.terminate();
    }
  }

  //#websocket-handler

  /**
   * A handler that treats incoming messages as a name,
   * and responds with a greeting to that name
   */
  public static Flow<Message, Message, NotUsed> greeter() {
    return
      Flow.<Message>create()
        .collect(new JavaPartialFunction<Message, Message>() {
              @Override
              public Message apply(Message msg, boolean isCheck) throws Exception {
                if (isCheck) {
                    if (msg.isText()) {
                        return null;
                    } else {
                        throw noMatch();
                    }
                } else {
                    return handleTextMessage(msg.asTextMessage());
                }
              }
        });
  }

  public static TextMessage handleTextMessage(TextMessage msg) {
    if (msg.isStrict()) // optimization that directly creates a simple response...
    {
        return TextMessage.create("Hello " + msg.getStrictText());
    } else // ... this would suffice to handle all text messages in a streaming fashion
    {
        return TextMessage.create(Source.single("Hello ").concat(msg.getStreamedText()));
    }
  }
  //#websocket-handler
}
스테파노 보네 티

아래의 두 가지 중요 사항을 해결하십시오.

1-활성 연결을 효과적으로 계산하려면 메트릭을 HttpRequest 흐름이 아닌 메시지 흐름에 연결해야합니다. 을 사용하여이 작업을 수행 할 수 있습니다 watchTermination. 아래 handleRequest 메서드에 대한 코드 예제

public static HttpResponse handleRequest(HttpRequest request) {
  HttpResponse result;
  if (request.getUri().path().equals("/greeter")) {
    final Flow<Message, Message, NotUsed> greeterFlow = greeter().watchTermination((nu, cd) -> {
      connections.incrementAndGet();
      cd.whenComplete((done, throwable) -> connections.decrementAndGet());
      return nu;
    });
    result = WebSocket.handleWebSocketRequestWith(request, greeterFlow);
  } else {
    result = HttpResponse.create().withStatus(413);
  }
  return result;
}

2-서버가 독립적으로 메시지를 보낼 수 있도록을 사용하여 메시지 흐름을 만들 수 있습니다 Flow.fromSinkAndSource. 아래 예 (하나의 메시지 만 전송 됨) :

public static Flow<Message, Message, NotUsed> greeter() {
  return Flow.fromSinkAndSource(Sink.ignore(),
    Source.single(new akka.http.scaladsl.model.ws.TextMessage.Strict("Hello!"))
  );
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Play Framework, Scala-새 데이터를 사용할 수있는 경우에만 클라이언트에 websocket 메시지 보내기

분류에서Dev

매개 변수를 사용하여 클라이언트에 websocket 메시지 보내기

분류에서Dev

kafka 메시지를 소비하고 클라이언트가 보내는 필터를 통해 websocket 클라이언트에 보내는 가장 좋은 방법

분류에서Dev

PHP WebSocket – 지정된 클라이언트에 메시지를 보내는 방법은 무엇입니까?

분류에서Dev

클라이언트에 메시지를 보내는 서버

분류에서Dev

Pidgin에서 다른 클라이언트가 보낸 메시지를 볼 수있는 방법이 있습니까?

분류에서Dev

클라이언트가 요청하지 않고 클라이언트 소켓에서 데이터 보내기 C #

분류에서Dev

wso2esb 5.0-WebSocket을 통해 WSO2에서 클라이언트로 메시지 보내기

분류에서Dev

JavaScript가 클라이언트에게 "보이지 않게"될 수 있습니까?

분류에서Dev

Akka-http, Java에서 클라이언트 IP 가져 오기

분류에서Dev

연결된 클라이언트에 메시지를 보내지 않는 서버

분류에서Dev

HTTP 메서드가 지원되지 않는 경우 클라이언트에 메시지 보내기

분류에서Dev

서버가 큐에 넣은 클라이언트 수 및 클라이언트가 큐에 있는지 여부

분류에서Dev

클라이언트가 연결되기 전에 전송 된 큐에서 ActiveMQ 수신 메시지

분류에서Dev

모든 클라이언트에 메시지를 보내는 Python TCP 서버

분류에서Dev

클라이언트에서 연결시 메시지를 보내도록 Camel Websocket 구성 요소를 얻는 방법은 무엇입니까?

분류에서Dev

서버가 C의 소켓을 통해 클라이언트에 메시지를 보낼 수 없습니다.

분류에서Dev

내 Netty 클라이언트에서 내 서버로 문자열 메시지 보내기

분류에서Dev

Android 소켓 클라이언트가 메시지를 보내고받을 수 없음

분류에서Dev

Socket.io, 클라이언트에서 사용자 지정 이벤트를 내보낼 수 없습니다.

분류에서Dev

클라이언트가 모바일 또는 데스크톱에서 내 웹 사이트를보고 있는지 어떻게 식별 할 수 있습니까?

분류에서Dev

Python 서버에서 자바 클라이언트로 프로토콜 버퍼 인코딩 메시지 보내기

분류에서Dev

Lambda @ Edge 함수에서 클라이언트 요청 도메인 가져 오기

분류에서Dev

수신자의 이메일 클라이언트의 언어를 기반으로 인식 된 여러 언어 버전으로 이메일 보내기

분류에서Dev

자바 소켓 : 클라이언트가 서버로부터 메시지를받을 수 있는지 확인

분류에서Dev

ADM 클라이언트에서 수신되지 않는 메시지

분류에서Dev

ADM 클라이언트에서 수신되지 않는 메시지

분류에서Dev

클라이언트에서 FCM 메시지 보내기가 작동하지 않음

분류에서Dev

클라이언트가 모바일에서 내 웹 사이트를 보는지 어떻게 식별 할 수 있습니까?

Related 관련 기사

  1. 1

    Play Framework, Scala-새 데이터를 사용할 수있는 경우에만 클라이언트에 websocket 메시지 보내기

  2. 2

    매개 변수를 사용하여 클라이언트에 websocket 메시지 보내기

  3. 3

    kafka 메시지를 소비하고 클라이언트가 보내는 필터를 통해 websocket 클라이언트에 보내는 가장 좋은 방법

  4. 4

    PHP WebSocket – 지정된 클라이언트에 메시지를 보내는 방법은 무엇입니까?

  5. 5

    클라이언트에 메시지를 보내는 서버

  6. 6

    Pidgin에서 다른 클라이언트가 보낸 메시지를 볼 수있는 방법이 있습니까?

  7. 7

    클라이언트가 요청하지 않고 클라이언트 소켓에서 데이터 보내기 C #

  8. 8

    wso2esb 5.0-WebSocket을 통해 WSO2에서 클라이언트로 메시지 보내기

  9. 9

    JavaScript가 클라이언트에게 "보이지 않게"될 수 있습니까?

  10. 10

    Akka-http, Java에서 클라이언트 IP 가져 오기

  11. 11

    연결된 클라이언트에 메시지를 보내지 않는 서버

  12. 12

    HTTP 메서드가 지원되지 않는 경우 클라이언트에 메시지 보내기

  13. 13

    서버가 큐에 넣은 클라이언트 수 및 클라이언트가 큐에 있는지 여부

  14. 14

    클라이언트가 연결되기 전에 전송 된 큐에서 ActiveMQ 수신 메시지

  15. 15

    모든 클라이언트에 메시지를 보내는 Python TCP 서버

  16. 16

    클라이언트에서 연결시 메시지를 보내도록 Camel Websocket 구성 요소를 얻는 방법은 무엇입니까?

  17. 17

    서버가 C의 소켓을 통해 클라이언트에 메시지를 보낼 수 없습니다.

  18. 18

    내 Netty 클라이언트에서 내 서버로 문자열 메시지 보내기

  19. 19

    Android 소켓 클라이언트가 메시지를 보내고받을 수 없음

  20. 20

    Socket.io, 클라이언트에서 사용자 지정 이벤트를 내보낼 수 없습니다.

  21. 21

    클라이언트가 모바일 또는 데스크톱에서 내 웹 사이트를보고 있는지 어떻게 식별 할 수 있습니까?

  22. 22

    Python 서버에서 자바 클라이언트로 프로토콜 버퍼 인코딩 메시지 보내기

  23. 23

    Lambda @ Edge 함수에서 클라이언트 요청 도메인 가져 오기

  24. 24

    수신자의 이메일 클라이언트의 언어를 기반으로 인식 된 여러 언어 버전으로 이메일 보내기

  25. 25

    자바 소켓 : 클라이언트가 서버로부터 메시지를받을 수 있는지 확인

  26. 26

    ADM 클라이언트에서 수신되지 않는 메시지

  27. 27

    ADM 클라이언트에서 수신되지 않는 메시지

  28. 28

    클라이언트에서 FCM 메시지 보내기가 작동하지 않음

  29. 29

    클라이언트가 모바일에서 내 웹 사이트를 보는지 어떻게 식별 할 수 있습니까?

뜨겁다태그

보관