3

を使用するサーブレットを作成しようとしていますorg.apache.catalina.websocket.WebSocketServlet。Websocket チャットの例を見つけましたが、Websocket サーバー (このサーブレットに実装されています) のリスニング ポートを指定する方法がわかりません。たとえば、ポートでクライアント接続をリッスンする必要があります11337。しかし、これをどのように表現すればよいでしょうか。

OK、これが(簡略化された)コードです:

public class TestServlet extends WebSocketServlet {
    private static final Logger logger = LoggerFactory.getLogger(TestServlet.class);

    public TestServlet() {
        logger.error("Initializing TestServlet");
    }

    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
        logger.error("New WS connection, subProtocol=" + subProtocol + ", request=" + request.getRequestURL());
        return new TestConnection();
    }

    private class TestConnection extends MessageInbound {

        @Override
        protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
            logger.error("onBinaryMessage");
        }

        @Override
        protected void onTextMessage(CharBuffer charBuffer) throws IOException {
            logger.error("onBinaryMessage: " + charBuffer);
            sendMessage("Test message");
        }

        public void sendMessage(String message) {
            WsOutbound outbound = this.getWsOutbound();
            CharBuffer cb = CharBuffer.wrap(message);
            try {
                outbound.writeTextMessage(cb);
            } catch (IOException e) {
                logger.error("failed to write outbound");
            }
        }
    }
}

リスニング ポートを設定できる場所と方法が見つかりません。公式のwebsocketドキュメントもあまり役に立ちません。

したがって、サーブレット設定のどこかに設定できると思いますが、どこにあるのかわかりません。

誰にもアイデアはありますか?

4

1 に答える 1

4

WebSocket は HTTP プロトコルで動作するように設計されているため、通常の TCP ソケットのように別のリッスン ポートはありませんが、デプロイされた同じサーバー ポートを使用します。

したがって、ここであなたの場合、Tomcatサーバーを使用している場合、websocketは通信にポート8080を使用する場合があります(明示的に変更していない場合)。接続が確立され、接続が閉じられたときに通知を受け取るには、MessageInbound クラスの onOpen メソッドと onClose メソッドをオーバーライドする必要がある場合があります。詳細については、以下のサンプル コードを参照してください。

public class IncomingMessageHandler extends MessageInbound {

    private WsOutbound myoutbound;
    public IncomingMessageHandler() {

    }

    @Override
    public void onOpen(WsOutbound outbound) {
        logger.info("Open Client.");
        this.myoutbound = outbound;
    }

    @Override
    public void onClose(int status) {
        logger.info("Close Client.");           
    }

    /**
     * Called when received plain Text Message
     */
    @Override
    public void onTextMessage(CharBuffer cb) throws IOException {

    }

    /**
     * We can use this method to pass image binary data, eventually !
     */
    @Override
    public void onBinaryMessage(ByteBuffer bb) throws IOException {

    }

    public synchronized void sendTextMessage(String message) {
        try {
            CharBuffer buffer = CharBuffer.wrap(message);
            this.getMyoutbound().writeTextMessage(buffer);
            this.getMyoutbound().flush();

        } catch (IOException e) {   
        }
    }

    /**
     * Set timeout in milliseconds, -1 means never
     */
    @Override
    public int getReadTimeout() {
        return -1;
    }

    public WsOutbound getMyoutbound() {
        return myoutbound;
    }
    public void setMyoutbound(WsOutbound myoutbound) {
        this.myoutbound = myoutbound;
    }
}
于 2013-12-23T07:38:06.633 に答える