2015-05-04 16 views
9

Questo funziona:WebSockets non funziona senza WebApp

String webappDir = "..."; 
context = tomcat.addWebapp("/", new File(webappDir).getAbsolutePath()); 

Questo non lo fa:

context = tomcat.addContext("/", new File("").getAbsolutePath()); 

non ho davvero bisogno di un webappDir in questo caso, perché non sto servendo tutte le pagine JSP o risorse lato client, sto semplicemente usando solo il lato server response.getWriter().println(...);.

Non ci sono eccezioni, la websocket semplicemente non si apre.

Posso presumere che si tratti di un bug di tomcat?

+2

Se non è necessario un contesto di applicazione Web, è possibile utilizzare l'API Java per WebSockets JSR 356 direttamente anziché l'API websockets di tomcat. – vzamanillo

+1

È possibile creare il client come app Java autonoma con JSR 356, per creare un server è possibile utilizzare qualsiasi contenitore di server Java EE con supporto websockets, incorporato o meno (GlassFish, Apache Tomcat, Jetty ...) per distribuire un WebSocketServlet e ascoltare per i messaggi dei clienti. – vzamanillo

+1

Penso che non sia possibile, l'API websockets è progettata per l'utilizzo di socket nelle applicazioni Web, quindi è necessario un contenitore, se non si ha bisogno di un'applicazione web non si usano websocket, si usano semplicemente socket Java. – vzamanillo

risposta

1

Se si guarda in test (test/org/apache/tomcat/websocket nel codice sorgente), che fanno

tomcat.addContext("", null); 

noti che passando null invece di un percorso di contesto ha bisogno di un recente Tomcat 8 (non più vecchio di diversi mesi). La versione corrente è 8.0.22.

Posso presumere che si tratti di un errore di tomcat?

La regola "prima di archiviare un bug" è di chiedere sulla mailing list degli utenti, non su StackOverflow.

+1

Sì, i test in 8.0.21 utilizzano quell'API. –

3

beh, queste due funzioni sono completamente diverse. Se si guarda la javadoc per la funzione addContext, è possibile vedere che è necessario configurare il contesto per poter utilizzare websocket. questo viene recuperato dal documento api.

Aggiungere un contesto - modalità programmatica, nessun web.xml predefinito utilizzato. Questo significa che non supporta JSP (nessun servlet JSP), nessun servlet predefinito e nessun supporto per socket Web se non esplicitamente abilitato tramite l'interfaccia programmatica .

Quindi, nel tuo caso, credo che tu possa seguire il test case in questo link come aggiungere un endpoint nel contesto.

Per quanto riguarda l'ipotesi che si tratti di un bug o meno. Personalmente, non penso che questo sia un bug in quanto lo stesso sviluppatore menziona già che non forniscono la connessione web socket. Ma, per essere sicuri, puoi contattarli e chiedere;).

+1

Ovviamente puoi usare websocket.Quello che voglio dire è che hai bisogno di più sforzi per configurarlo in quanto non viene "gratis". Se avrò tempo, proverò a vedere il tuo repository git. –