2

Apache Tomcat 7.0.29 を 32 ビット Windows XP と 64 ビット Debian 6.0.5 Linux にインストールし、websocket のサンプルを使用してみました。しかし、それらは正しく実行されていません。サーバーに接続することさえできません。

echo の例 (メッセージ API の選択) を使用し、[接続] ボタンを押しても何も起こりません。しかし、20 秒後に「WebSocket 接続が閉じられました」というメッセージがログ テキスト領域に表示されます。しかし、他の記事で述べられているように、これは既知の問題です。

自作の websocket アプリケーションを使用してサーバーに接続しようとすると、MessageInbound#onOpen メソッドのログ ステートメントが出力されることに気付きました。そのため、このメソッドが呼び出されます。ただし、ブラウザの Javascript 部分の onopen コールバックは起動しません。ただし、Tomcat インスタンスを終了した直後に、クライアントの onopen が呼び出され、その直後に onclose が呼び出されます。

これまたは同様の動作を確認できる人はいますか? または、Tomcat 7 で動作する websocket の例を持っている人はいますか? 助けてくれてありがとう。

更新:自分で作成したサンプル アプリケーションのコードを追加しました。

サーバー部分の 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);
        }
    }
}

そして、ここに唯一無二の JSF facelet 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>

方法はわかりませんが、コードの作成に役立つことを願っています。

セバスチャン

4

4 に答える 4

10

WebSocketServletTomcat 7 でも拡張は非推奨になりました。Tomcat 7.0.47から標準が提供されているため、クラスのアノテーションをjavax.websocket-api使用して Websocket エンドポイントを簡単に作成できます。依存関係を provided として設定していることを確認してください@ServerEndpoint

プロキシとして Apache または IIS の背後で実行することも問題を引き起こす可能性があるため、最初は Tomcat を直接叩いてみてください。

于 2013-12-19T09:46:42.477 に答える
1

まず、Tomcat のバージョンが websocket をサポートしていることを確認してください。7.0.42 以降を使用することをお勧めします。

2 番目よりも、websocket のこのサンプル コードを参照して、開始することができます。とてもシンプルです。

于 2013-12-30T11:53:38.643 に答える
0

私は Apache Tomcat WebSocket 実装を使用していません。ただし、クライアントが WebSocket アップグレードが有効になっていない通常の HTTP サーバー エンドポイントに接続しようとしていることを示す前に、このタイプのエラーを確認したことがあります。これは、サーバー コード自体よりも、Tomcat 構成 (web.xml) に関係している可能性があります。

つまり、クライアントは接続を試みてws://localhost:8080/Testapp/websocketいますが、サーバーがその場所での WebSocket アップグレードに応答するように構成されていない可能性があります。おそらくそれは実際にはws://localhost:8080/websocketまたはws://localhost:8080/Testapp/websocket.doです。

于 2012-09-07T12:49:39.147 に答える