Create websocket with play framework 2.6





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I am trying to do the following with Play Framework 2.6 :




  1. The browser targets the server and a websocket is created

  2. Later on (after some other request is performed), the servers sends a message to the browser via the websocket previously created


1) Can be easily done with a route :



public WebSocket socket() {
return WebSocket.Text.accept(request -> {
// Log events to the console
Sink<String, ?> in = Sink.foreach(System.out::println);

// Send a single 'Hello!' message and then leave the socket open
Source<String, ?> out = Source.single("Hello!").concat(Source.maybe());

return Flow.fromSinkAndSource(in, out);
});
}


and the websocket can be saved server side.



2) But then how can I send data via the websocket ? (triggered server side)



This was easy to do with 2.5 but the documentation is not very helpful for play 2.6.



Thank you










share|improve this question





























    0















    I am trying to do the following with Play Framework 2.6 :




    1. The browser targets the server and a websocket is created

    2. Later on (after some other request is performed), the servers sends a message to the browser via the websocket previously created


    1) Can be easily done with a route :



    public WebSocket socket() {
    return WebSocket.Text.accept(request -> {
    // Log events to the console
    Sink<String, ?> in = Sink.foreach(System.out::println);

    // Send a single 'Hello!' message and then leave the socket open
    Source<String, ?> out = Source.single("Hello!").concat(Source.maybe());

    return Flow.fromSinkAndSource(in, out);
    });
    }


    and the websocket can be saved server side.



    2) But then how can I send data via the websocket ? (triggered server side)



    This was easy to do with 2.5 but the documentation is not very helpful for play 2.6.



    Thank you










    share|improve this question

























      0












      0








      0








      I am trying to do the following with Play Framework 2.6 :




      1. The browser targets the server and a websocket is created

      2. Later on (after some other request is performed), the servers sends a message to the browser via the websocket previously created


      1) Can be easily done with a route :



      public WebSocket socket() {
      return WebSocket.Text.accept(request -> {
      // Log events to the console
      Sink<String, ?> in = Sink.foreach(System.out::println);

      // Send a single 'Hello!' message and then leave the socket open
      Source<String, ?> out = Source.single("Hello!").concat(Source.maybe());

      return Flow.fromSinkAndSource(in, out);
      });
      }


      and the websocket can be saved server side.



      2) But then how can I send data via the websocket ? (triggered server side)



      This was easy to do with 2.5 but the documentation is not very helpful for play 2.6.



      Thank you










      share|improve this question














      I am trying to do the following with Play Framework 2.6 :




      1. The browser targets the server and a websocket is created

      2. Later on (after some other request is performed), the servers sends a message to the browser via the websocket previously created


      1) Can be easily done with a route :



      public WebSocket socket() {
      return WebSocket.Text.accept(request -> {
      // Log events to the console
      Sink<String, ?> in = Sink.foreach(System.out::println);

      // Send a single 'Hello!' message and then leave the socket open
      Source<String, ?> out = Source.single("Hello!").concat(Source.maybe());

      return Flow.fromSinkAndSource(in, out);
      });
      }


      and the websocket can be saved server side.



      2) But then how can I send data via the websocket ? (triggered server side)



      This was easy to do with 2.5 but the documentation is not very helpful for play 2.6.



      Thank you







      websocket playframework






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 26 '18 at 17:36









      gsprsgsprs

      658




      658
























          1 Answer
          1






          active

          oldest

          votes


















          0





          +50









          I've managed to implement websocket with help of Akka actors. At first step define actor that will handle messages



          public class WebSocketActor extends AbstractActor {

          private final ActorRef out;

          @Inject
          public WebSocketActor(ActorRef out) {
          this.out = out;
          }

          @Override
          public Receive createReceive() {
          return receiveBuilder()
          .match(String.class, message ->
          out.tell("Sending message at " + LocalDateTime.now().toString(), self())
          )
          .build();
          }

          public static Props props(final ActorRef out) {
          return Props.create(WebSocketActor.class, out);
          }
          }


          This actor will be created per client. ActorRef out will send message to connected client. In this example response is send to client on each string message passed to WebSocketActor.



          Now define API endpoint to open access to websocket for clients. Define ActorFlow that will create new instance of actor on new connection



          public WebSocket ws() {
          return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
          }


          According to source code ActorFlow creates actors with flowActor name. So to send message to websockets somewhere in the code we can find actors by their path. This will broadcast message to all connected clients



          actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());


          Unfortunately I didn't find easy way to change ActorFlow default name but maybe this answer may help you play-scala-akka-websockets-change-actor-path.



          Also you can check play-java-websocket-example project from playframework examples.






          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53486314%2fcreate-websocket-with-play-framework-2-6%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0





            +50









            I've managed to implement websocket with help of Akka actors. At first step define actor that will handle messages



            public class WebSocketActor extends AbstractActor {

            private final ActorRef out;

            @Inject
            public WebSocketActor(ActorRef out) {
            this.out = out;
            }

            @Override
            public Receive createReceive() {
            return receiveBuilder()
            .match(String.class, message ->
            out.tell("Sending message at " + LocalDateTime.now().toString(), self())
            )
            .build();
            }

            public static Props props(final ActorRef out) {
            return Props.create(WebSocketActor.class, out);
            }
            }


            This actor will be created per client. ActorRef out will send message to connected client. In this example response is send to client on each string message passed to WebSocketActor.



            Now define API endpoint to open access to websocket for clients. Define ActorFlow that will create new instance of actor on new connection



            public WebSocket ws() {
            return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
            }


            According to source code ActorFlow creates actors with flowActor name. So to send message to websockets somewhere in the code we can find actors by their path. This will broadcast message to all connected clients



            actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());


            Unfortunately I didn't find easy way to change ActorFlow default name but maybe this answer may help you play-scala-akka-websockets-change-actor-path.



            Also you can check play-java-websocket-example project from playframework examples.






            share|improve this answer




























              0





              +50









              I've managed to implement websocket with help of Akka actors. At first step define actor that will handle messages



              public class WebSocketActor extends AbstractActor {

              private final ActorRef out;

              @Inject
              public WebSocketActor(ActorRef out) {
              this.out = out;
              }

              @Override
              public Receive createReceive() {
              return receiveBuilder()
              .match(String.class, message ->
              out.tell("Sending message at " + LocalDateTime.now().toString(), self())
              )
              .build();
              }

              public static Props props(final ActorRef out) {
              return Props.create(WebSocketActor.class, out);
              }
              }


              This actor will be created per client. ActorRef out will send message to connected client. In this example response is send to client on each string message passed to WebSocketActor.



              Now define API endpoint to open access to websocket for clients. Define ActorFlow that will create new instance of actor on new connection



              public WebSocket ws() {
              return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
              }


              According to source code ActorFlow creates actors with flowActor name. So to send message to websockets somewhere in the code we can find actors by their path. This will broadcast message to all connected clients



              actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());


              Unfortunately I didn't find easy way to change ActorFlow default name but maybe this answer may help you play-scala-akka-websockets-change-actor-path.



              Also you can check play-java-websocket-example project from playframework examples.






              share|improve this answer


























                0





                +50







                0





                +50



                0




                +50





                I've managed to implement websocket with help of Akka actors. At first step define actor that will handle messages



                public class WebSocketActor extends AbstractActor {

                private final ActorRef out;

                @Inject
                public WebSocketActor(ActorRef out) {
                this.out = out;
                }

                @Override
                public Receive createReceive() {
                return receiveBuilder()
                .match(String.class, message ->
                out.tell("Sending message at " + LocalDateTime.now().toString(), self())
                )
                .build();
                }

                public static Props props(final ActorRef out) {
                return Props.create(WebSocketActor.class, out);
                }
                }


                This actor will be created per client. ActorRef out will send message to connected client. In this example response is send to client on each string message passed to WebSocketActor.



                Now define API endpoint to open access to websocket for clients. Define ActorFlow that will create new instance of actor on new connection



                public WebSocket ws() {
                return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
                }


                According to source code ActorFlow creates actors with flowActor name. So to send message to websockets somewhere in the code we can find actors by their path. This will broadcast message to all connected clients



                actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());


                Unfortunately I didn't find easy way to change ActorFlow default name but maybe this answer may help you play-scala-akka-websockets-change-actor-path.



                Also you can check play-java-websocket-example project from playframework examples.






                share|improve this answer













                I've managed to implement websocket with help of Akka actors. At first step define actor that will handle messages



                public class WebSocketActor extends AbstractActor {

                private final ActorRef out;

                @Inject
                public WebSocketActor(ActorRef out) {
                this.out = out;
                }

                @Override
                public Receive createReceive() {
                return receiveBuilder()
                .match(String.class, message ->
                out.tell("Sending message at " + LocalDateTime.now().toString(), self())
                )
                .build();
                }

                public static Props props(final ActorRef out) {
                return Props.create(WebSocketActor.class, out);
                }
                }


                This actor will be created per client. ActorRef out will send message to connected client. In this example response is send to client on each string message passed to WebSocketActor.



                Now define API endpoint to open access to websocket for clients. Define ActorFlow that will create new instance of actor on new connection



                public WebSocket ws() {
                return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
                }


                According to source code ActorFlow creates actors with flowActor name. So to send message to websockets somewhere in the code we can find actors by their path. This will broadcast message to all connected clients



                actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());


                Unfortunately I didn't find easy way to change ActorFlow default name but maybe this answer may help you play-scala-akka-websockets-change-actor-path.



                Also you can check play-java-websocket-example project from playframework examples.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 11 '18 at 20:15









                Valerii RusakovValerii Rusakov

                8012920




                8012920
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53486314%2fcreate-websocket-with-play-framework-2-6%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Wiesbaden

                    Marschland

                    Dieringhausen