2

非常に簡単な解決策があると思わざるを得ませんが、今のところ運がありません。私はインターネットの端に行って振り返り、RFC6455全体を読んで舞台裏で何が起こっているかなどを理解したと思います。私は開発にEclipseを使用し、開発マシンで最新のTomcatを実行しています。

これは、保護された StreamInbound メソッドで @Override を削除する必要があることを示唆しているため、Eclipse がコンパイルさえしない私のテスト クラスです。実際の文言:

タイプ wsListenerTest のメソッド createWebSocketInbound(String) は、スーパータイプ メソッドをオーバーライドまたは実装する必要があります。

@Override を削除することをお勧めします。

他のサーバーやプラグインを使用せずに、Tomcat にネイティブですべてを実行しようとしています。

前もって感謝します

package com.blah.blah;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

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


public class wsListenerTest extends WebSocketServlet {

private static final long serialVersionUID = 1L;
static int numConnections = 0;

    private static final String GUEST_PREFIX = "Guest";

    private final AtomicInteger connectionIds = new AtomicInteger(0);
    private final Set<ChatMessageInbound> connections = new CopyOnWriteArraySet<ChatMessageInbound>();

    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol) {
        return new ChatMessageInbound(connectionIds.incrementAndGet());
    }

    private final class ChatMessageInbound extends MessageInbound {

        private final String nickname;

        private ChatMessageInbound(int id) {
            this.nickname = GUEST_PREFIX + id;
        }

        @Override
        protected void onOpen(WsOutbound outbound) {
            connections.add(this);
            String message = String.format("* %s %s",
                    nickname, "has joined.");
            broadcast(message);
        }

        @Override
        protected void onClose(int status) {
            connections.remove(this);
            String message = String.format("* %s %s",
                    nickname, "has disconnected.");
            broadcast(message);
        }

        @Override
        protected void onBinaryMessage(ByteBuffer message) throws IOException {
            throw new UnsupportedOperationException(
                    "Binary message not supported.");
        }

        @Override
        protected void onTextMessage(CharBuffer message) throws IOException {
            // Never trust the client
//                String filteredMessage = String.format("%s: %s",nickname, HTMLFilter.filter(message.toString()));
            broadcast(message.toString());
        }

        private void broadcast(String message) {
            for (ChatMessageInbound connection : connections) {
                try {
                    CharBuffer buffer = CharBuffer.wrap(message);
                    connection.getWsOutbound().writeTextMessage(buffer);
                } catch (IOException ignore) {
                    // Ignore
                }
            }
        }
    }
}   
4

1 に答える 1

0

WebSocketServletのcreateWebSocketInbound()メソッドには次のものがあるため、コンパイラはこの@Overrideについて不平を言っていると思います。

protected abstract StreamInbound createWebSocketInbound(String subProtocol,
                                                        HttpServletRequest request);

メソッドにHttpServletRequestパラメーターを追加してみてください。これは、この障害を乗り越えるのに役立ちます。

于 2013-02-03T23:02:42.720 に答える