Tomcat实现Web Socket

原文链接:https://www.dubby.cn/detail.html?id=9103

1、依赖

本文使用的是Tomcat9

项目结构也是最基本的servlet的项目结构:

代码地址:github.com/dubby1994/t…

其实啥依赖都不需要,但是需要几个api,这些在Tomcat里都已经提供了,但是代码里还是需要提供一下,不然编译报错:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>
复制代码

2、配置

ExamplesConfig.java

package cn.dubby.tomcat.study.config;
import cn.dubby.tomcat.study.ws.EchoEndpoint;
import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.HashSet;
import java.util.Set;

public class ExamplesConfig implements ServerApplicationConfig {
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) {
        Set<ServerEndpointConfig> result = new HashSet<>();
        if (scanned.contains(EchoEndpoint.class)) {
            result.add(ServerEndpointConfig.Builder.create(EchoEndpoint.class, "/websocket").build());
        }
        return result;
    }
    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
        Set<Class<?>> results = new HashSet<>();
        for (Class<?> clazz : scanned) {
            if (clazz.getPackage().getName().contains("ws")) {
                results.add(clazz);
            }
        }
        return results;
    }
}
复制代码

其中getEndpointConfigs是配置所有继承Endpoint的类,而getAnnotatedEndpointClasses是配置所有被@ServerEndpoint修饰的类。

3、继承Endpoint

public class EchoEndpoint extends Endpoint {
    private static final AtomicLong count = new AtomicLong();
    @Override
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        System.out.println("在线人数:" + count.incrementAndGet());
        session.addMessageHandler(new EchoMessageHandlerText(session));
    }
    @Override
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("在线人数:" + count.decrementAndGet());
    }
    private static class EchoMessageHandlerText implements MessageHandler.Partial<String> {
        private final Session session;
        private EchoMessageHandlerText(Session session) {
            this.session = session;
        }
        @Override
        public void onMessage(String message, boolean last) {
            if (session == null)
                return;
            System.out.println(session.getId() + "\t" + message);
            try {
                session.getBasicRemote().sendText(message, last);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

4、使用注解

@ServerEndpoint("/websocket2")
public class EchoEndpoint2 {
    private static final AtomicLong count = new AtomicLong();
    @OnOpen
    public void open(Session session) {
        System.out.println("在线人数:" + count.incrementAndGet());
        try {
            session.getBasicRemote().sendText("welcome");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnClose
    public void close(Session session) {
        System.out.println("在线人数:" + count.decrementAndGet());
    }
    @OnMessage
    public void echoTextMessage(Session session, String message) {
        System.out.println(session.getId() + "\t" + message);
        try {
            if (session.isOpen()) {
                session.getBasicRemote().sendText(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnMessage
    public void echoBinaryMessage(Session session, ByteBuffer bb) {
        System.out.println(session.getId() + "\t" + bb.toString());
        try {
            if (session.isOpen()) {
                session.getBasicRemote().sendBinary(bb);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnMessage
    public void echoPongMessage(PongMessage pm) {
        //pass
    }
}
复制代码

例子就不给了,和昨天的几乎是一样的,你可以直接用昨天的那个html来测试今天的。

转载于:https://juejin.im/post/5bc6d5996fb9a05ce7518e89

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值