WebSockets arbeiten nicht auf Tomcat 7

Habe ich installiert, Apache Tomcat 7.0.29 auf Windows XP 32bit als auch auf 64bit Debian Linux 6.0.5 und habe versucht, über die websocket-Beispiele. Aber Sie sind nicht richtig läuft. Ich bin nicht einmal in der Lage, eine Verbindung zum server herstellen.

Mit dem echo-Beispiel (in der Auswahl der Nachrichten-API) und drücken Sie die Connect-Taste passiert nichts. Aber nach 20sek die Meldung "WebSocket-Verbindung geschlossen" erscheint in der log steht. Aber wie die anderen Artikel Stand, dies ist ein bekanntes Problem.

Bei Verwendung eines self-made-websocket-Anwendung und versuchen eine Verbindung zum server herstellen, habe ich gemerkt, dass das Protokoll Aussagen der MessageInbound#onOpen Methode gedruckt werden, daher wird diese Methode aufgerufen. Jedoch, die onopen-Rückruf in den Browsern der Javascript-Teil wird nicht gefeuert. Aber direkt nach Beendigung der tomcat-Instanz, die Kunden onopen aufgerufen wird, unmittelbar gefolgt von einer onclose.

Ist es jemand, der bestätigen kann, dieses oder ein ähnliches Verhalten? Oder hat jemand das websocket-Beispiele arbeiten auf Tomcat 7? Vielen Dank für jede Hilfe.

Update: ich habe den code für meine selbst erstellte Beispielanwendung.

Hier ist der server-Teil, die WebSocketTestServlet.java:

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;

@WebServlet(value = "/websocket", loadOnStartup = 1)
public class WebSocketTestServlet extends WebSocketServlet
{
    private static final long serialVersionUID = 1L;

    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request)
    {
        return new WebSocketTestInbound();
    }

    public static final class WebSocketTestInbound extends MessageInbound
    {
        @Override
        protected void onOpen(WsOutbound outbound)
        {
            System.out.println("WebSocketTestServlet#onOpen");
        }

        @Override
        protected void onClose(int status)
        {
            System.out.println("WebSocketTestServlet#onClose");
        }

        @Override
        protected void onBinaryMessage(ByteBuffer message) throws IOException
        {
            System.out.println("WebSocketTestServlet#onBinaryMessage received: " + message);
        }

        @Override
        protected void onTextMessage(CharBuffer message) throws IOException
        {           
            System.out.println("WebSocketTestServlet#onTextMessage received: " + message);
        }
    }
}

Und hier der eine und einzige JSF passenden main.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">

    <h:head>
        <title>Test suite</title>
        <script type="text/javascript">

        var ws = null;

        function connect()
        {
            var wsUrl = $('#id_wsUrl');
            var wsMsg = $('#id_wsMsg');
            var wsSnd = $('#id_wsSnd');
            var wsCon = $('#id_wsCon');
            var url = wsUrl.val();

            //Connect
            if (ws == null)
            {
                if (window.WebSocket)
                    ws = new WebSocket(url);
                else if (window.MozWebSocket)
                    ws = new MozWebSocket(url);
                else
                {
                    alert('WebSocket not supported by this browser');
                    return;
                }

                ws.onopen = function()
                {
                    alert('Connection opened!');
                    wsMsg.removeAttr('disabled');
                    wsSnd.removeAttr('disabled');
                    wsUrl.attr('disabled', 'disabled');
                    wsCon.val('Disconnect');
                };

                ws.onclose = function()
                {
                    alert('Connection closed!');
                    wsMsg.attr('disabled', 'disabled');
                    wsSnd.attr('disabled', 'disabled');
                    wsUrl.removeAttr('disabled');
                    wsCon.val('Connect');
                };

                ws.onmessage = function(event)
                {
                    console.log('Inbound message: ' + event.data);
                    alert('Inbound message: ' + event.data);
                };

                ws.onerror = function()
                {
                    alert('Connection error!!!');
                };
            }
            //Disconnect
            else
            {
                ws.close();
                ws = null;
            }
        }

        function sendMessage()
        {
            if (ws)
            {
                var wsMsg = $('#id_wsMsg');
                var data = wsMsg.val();
                wsMsg.val('');

                if (data.length > 0)
                    ws.send(data);
            }
        }

        </script>
    </h:head>
    <h:outputScript target="head" library="js" name="jquery-1.8.0.js" />
    <h:body>
        <h1>WebSocket tests</h1>
        <h:panelGrid columns="2">
            <h:outputLabel for="id_wsUrl" value="WebSocket server URL:" />
            <h:panelGroup>
                <h:inputText id="id_wsUrl" style="width: 250px;" value="ws://localhost:8080/Testapp/websocket" />
                <h:commandButton type="button" id="id_wsCon" value="Connect" onclick="connect();" />
            </h:panelGroup>
            <h:outputLabel for="id_wsMsg" value="WebSocket outbound message" />
            <h:panelGroup>
                <h:inputText id="id_wsMsg" style="width: 250px;" value="" disabled="true" />
                <h:commandButton type="button" id="id_wsSnd" value="Send" disabled="true" onclick="sendMessage();" />
            </h:panelGroup>
        </h:panelGrid>
    </h:body>
</html>

Ich weiß nicht, wie, aber ich hoffe es hilft den code zu haben.

Sebastian

Bitte zeigen Sie den entsprechenden code. Es klingt wie Sie können eine Blockierung Lesen Sie irgendwo in Ihrem code.
Der code ist hauptsächlich der client-Teil des websocket-Beispiele im Lieferumfang von Tomcat 7. Aber ich habe den code für meine selbst erstellten test-Anwendung. Hoffe, das hilft.
Was mache ich falsch, dass mein code nicht farbig?
Welche Browser (Hersteller, version und OS) hast du getestet?
Getestet habe ich es in Mozilla Firefox 15.0.1, in SRWare Iron 21.0.1200.0 (Chromium-Derivat) und in Opera 12.02 auf 32bit Win XP Pro SP3. Beim Klick auf "Verbinden" in die websocket-chat-Beispiel, Opera entfernen gibt 'Info: WebSocket-Verbindung geschlossen', während Firefox druckt die gleiche Meldung nach 20sek Leerlauf-timeout. Chrome nicht alles drucken, bis den server beendet.

InformationsquelleAutor Sebastian S. | 2012-08-31

Schreibe einen Kommentar