tomcat websocket servlet 监听端口 [英] tomcat websocket servlet listening port

查看:62
本文介绍了tomcat websocket servlet 监听端口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个使用 org.apache.catalina.websocket.WebSocketServlet 的 servlet.我找到了一个 websocket 聊天的例子,但我不知道如何指定 websocket 服务器的监听端口(在这个 servlet 中实现)?例如,我需要监听端口 11337 上的客户端连接.但是我该如何表达呢?

I'm trying to write a servlet that uses org.apache.catalina.websocket.WebSocketServlet. I've found an example of websocket chat, but I can't figure out how can I specify the listening port for a websocket server (which is implemented in this servlet)? For example I need to listen for clients connection on port 11337. But how I can express this?

好的,这是(简化的)代码:

OK, here is the (simplified) code:

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 文档也没有多大帮助.

I can't find where and how I can set listening port. Official websocket documentation also doesn't help much.

所以我想它可以在servlet设置的某个地方设置,但找不到在哪里.

So I guess it can be set somewhere in servlet settings, but can't find where.

有人有什么想法吗?

推荐答案

WebSocket 旨在通过 HTTP 协议工作,因此它不会像普通 TCP Socket 那样有不同的侦听端口,但它使用与部署在相同的服务器端口.

WebSocket is designed to work over HTTP protocol and so it won't have different listening port like normal TCP Socket but it use the same server port that it deployed on.

所以在您的情况下,如果您使用的是 tomcat 服务器,那么 websocket 可能会使用端口 8080(如果您没有明确修改)进行通信.您可能需要覆盖 MessageInbound 类的 onOpen 和 onClose 方法才能在连接建立和连接关闭时获得通知.有关详细信息,请参阅以下示例代码.

so here in your case, if you are using tomcat server than websocket may use port 8080 (if you haven't modified explicitly) for communication. You may need to override onOpen and onClose methods of MessageInbound class to get notified on Connection established and connection close. Refer below sample code for more details.

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;
    }
}

这篇关于tomcat websocket servlet 监听端口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆