Announcement

Collapse
No announcement yet.

Websocket (JSR 356)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Websocket (JSR 356)

    Hallo,

    ich möchte die Websocket API von Java 7 EE (JSR 356) benutzen.

    Ich habe mir mehrere Tutorials durchgelesen und ein kleines Testprogramm geschrieben (siehe unten). Ich weiß aber nicht wie ich den Websocketserver starten kann, z.B. aus der Main-Methode, sodass er im Hintergrund läuft.

    Code:
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;
    	
    @ServerEndpoint("/Test") 
    public class WebsocketTest {	
    
    	Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());	
    	
    	@OnOpen
    	public void onOpen(Session peer) {
    		peers.add(peer);
    		System.out.println("Hello " + peer.toString());
    	}
    	
    	@OnClose
    	public void onClose(Session peer) {
    		System.out.println("Bye " + peer.toString());
    		peers.remove(peer);
    	}	
    	
    	
    	@OnMessage
    	public void message(String message, Session client) {
    		for (Session peer : peers) {
    			System.out.print(message);
    		}
    	}	
    }

  • #2
    Hallo,

    eine kurze Verständnisfrage: Das JAVA-Programm soll den Server starten und nicht einfach darauf zugreifen?

    Comment


    • #3
      Danke für die Antwort.
      Das JAVA-Programm soll der Server sozusagen sein. Die Main-Methode sollte den Webserver aktivieren und dann sollten Änderungen des JAVA-Programmes mit seinen Webservermethoden an Clients geschickt werden.

      Comment


      • #4
        Hallo,

        achso, ich dachte es soll ne Application werden, welche auf einem Websocket arbeitet.
        Da muss ich überlegen, das ist Jahre her!
        Aber folgenden Code habe ich in einer *.txt - Datei bei mir gefunden:

        Code:
         
        
        
        private ServerSock serverSock;
               
                private List<ClientSession> sessions = new ArrayList<ClientSession>();
         
                public WebsocketTest(int portnum) throws IOException{
                        serverSock = new ServerSock(portnum);
                       
                        ClientListener();
                }
               
                private void ClientListener(){
                        System.out.println("initializeClientListener()");
                        Thread thr = new Thread(new Runnable() {
                               
                                @Override
                                public void run() {
                                        while(true){
                                                try {
                                                        Socket socket = serverSock.accept();
                                                        ClientSession session = new ClientSession(socket);
                                                        sessions.add(session);
                                                } catch (IOException e) {
                                                        e.printStackTrace();
                                                }
                                        }
                                }
                        });
                        t.start();
                }
               
         
                public static void main(String[] args) throws IOException {
                        WebsocketTest webtest = new WebsocketTest(61001);
                }
         
        }

        Bei dir fehlt noch die Objekterzeugung/-zuweisung.

        Comment


        • #5
          ServerSock muss ServerSocket sein, oder? Und ClientSessions kann ich nicht in der JAVA API finden.
          Die Websocket Geschichte ist aber relativ neu. Meinst du, dass dein Code auch mit Websockets funktioniert?

          Kann es sein, dass man einen Server wie Glassfish für Websocket JSR 356 braucht?

          Comment


          • #6
            ein Websocket ist kein Serversocket
            Christian

            Comment


            • #7
              Danke für die Antwort.

              Genau deswegen habe ich gemeint, ob dies auch mit Websockets funktioniert. Ich beziehe mich auf die neue Websocket API aus JAVA EE 7 (JSR 356).

              Wie startet man den Websocketserver? Man liest immer nur wie @ServerEndpoint mit den Methoden implementiert wird, aber nie wie man überhaupt diesen Service startet.

              Für einen Vorschlag wäre ich sehr dankbar.

              Comment


              • #8
                Hallo,

                ah! Ich wusste das ich was vertauscht habe. Es ist zu lange her.
                Mir schwebt gerade noch etwas vor:

                Code:
                WebServer webServer = WebServers.createWebServer(8080);
                    webServer.add(new StaticFileHandler("/static-files"));
                    webServer.add("/websocket-echo", new WebSocketSampleHandler());
                    webServer.start();
                Die Source ist jedoch sicher hilfreich: https://github.com/TooTallNate/Java-WebSocket


                Ich bin keine wirkliche Hilfe, da ich nur raten kann. Nimm es mir nicht übel

                Comment


                • #9
                  Wie startet man den Websocketserver?
                  Das ist eine Webanwendung, die wird deployt auf einem Webserver und die läuft dann da.
                  Christian

                  Comment


                  • #10
                    Das heißt, dass die JAVA Websocket API aus JAVA 7 EE sich nur in Verbindung mit einem JAVA EE Anwendungsservers, wie z.B. GlassFish, benutzen lässt. Auf dem JAVA EE Anwendungsserver kann man jedoch auch beliebige JAVA Programme ausführen. Ich frage in JAVA Daten aus einem Mikrocontroller ab und möchte diese Daten per Websocket an die Clients schicken, dies geht dann auch im Anwendungsserver.
                    Websockets Frameworks wie das von ES© genannte (https://github.com/TooTallNate/Java-...ketServer.java) können aber standalone in einer JVM laufen.

                    Sind meine Gedanken soweit richtig oder habe ich etwas falsch verstanden?
                    Zuletzt editiert von ritchy; 21.08.2013, 22:37.

                    Comment


                    • #11
                      Wozu willst du Websockekts benutzen, wenn du überhaupt keine Webanwendung hast? Das ist programmieren gegen das Framework. Für eine CS-Verbindung gibt es erprobte andere Verbindungen -> Spring/RMI oder bsp. Webservices
                      Christian

                      Comment


                      • #12
                        Ich habe eine Webanwendung, die auf einem Webserver mit PHP realisiert ist. Außerdem habe ich einen Mikrocontroller, der die Temperatur misst, und für den ich eine JAVA Anwendung geschrieben habe.
                        Jetzt möchte ich diese zwei Anwendungen miteinander verbinden. Die Webseite, die vom Webserver bereitgestellt wird, beinhaltet dann den JavaScript Code für Websockets und die Änderungen sollen von dem JAVA Programm kommen. Dies ist ja prinzipiell mit Websockets möglich.

                        Wenn mir die JAVA 7 EE Websocket API ein standalone Betrieb nicht ermöglicht, werde ich wahrscheinlich ein Websocket Framework benutzen. Kann mir jemand ein gutes Framework empfehlen?
                        Auf dem ersten Blick sieht jWebSocket ganz gut aus. Laut http://jwebsocket.org/documentation/...lication-logic müsste dies auch standalone laufen, also in der JVM ohne ein Webserver.

                        Comment


                        • #13
                          Das Design der Anwendung ist mir nicht klar. Was nützt es, wenn eine Webseite mit Javascript Websockets benutzt? Deine Javaanwendung ist ja nicht diese Webseite, sondern ist woanders. Das klingt eher danach, als ob du einen HTTP-Client benötigst.
                          Christian

                          Comment


                          • #14
                            Meine Webseite beinhaltet diesen Websocketcode. Diese Webseite wird nicht von einer JAVA Anwendung erzeugt, sondern per PHP erzeugt. Insgesamt ist sie größer, aber nur dieser Abschnitt ist für mein Problem relevant.
                            Code:
                            <html>
                            <head>
                            <title> Websockets </title>
                            </head>
                            
                            <body>
                            Temperatur: <input id="Textfeld" type="text" value="keine Verbindung"/>
                            
                            <script type="text/javascript">
                            //document.getElementById('Textfeld').value = 42;
                            var connection = new WebSocket('ws://localhost:8080/hello');
                            
                            connection.onopen = function(){   
                               document.getElementById('Textfeld').value = "Verbindung aufgebaut";
                            }
                            connection.onclose = function(){   
                               document.getElementById('Textfeld').value = "Verbindung abgebaut";
                            }
                            connection.onerror = function(error){
                               alert('Error detected: ' + error);
                            }
                            connection.onmessage = function(e){  
                               document.getElementById('Textfeld').value = e.data;
                            }
                            //connection.send(JSON.stringify(message));
                            </script>
                            
                            </body>
                            </html>
                            Die Java standalone Anwendung soll die Temperaturdaten nur per Websocket an die Seite schicken. Websocket ist hierfür die beste Möglichkeit, da hier der Client nicht pollen muss, sondern die Java standalone Anwendung bei Änderung die Daten schickt. Dies möchte ich per JAVA machen, da die Anwendung, die die Daten ausliest schon in JAVA geschrieben ist.
                            Zuletzt editiert von ritchy; 23.08.2013, 15:45.

                            Comment


                            • #15
                              Sieht für mich nach einem falschen Designkonzept aus. Warum soll nun deinen Javaanwendung mit dem Server über Websockets kommunizieren, bloß weil deine Webseite das tut? Websockets sind für HTML gedacht. Hier wäre es sinnvoll, einen Webservice zu implementieren, der dann sowohl von der Webseite als auch von der Anwendung genutzt werden kann. Des Weiteren ist es wenig zielführend, wenn deine Javaanwendung die PHP-Websockets benutzen soll, mit Java irgendetwas serverseitiges zu programmieren (Beitrag#1). Der ist ja wohl schon vorhanden. Du benötigst die Java-Client-Seite
                              Christian

                              Comment

                              Working...
                              X