Tomcat和Jetty本身作为J2EE的容器而存在,所以Tomcat以及Jetty中对于Websocket协议的支持,都是基于Java自身所定义的接口进行的支持,各容器对WebSocket的具体实现方式不同,但常用的WebSocket接口,如@ServerPoint(定义一个WebSocket接口)等这样的应用层规范,由于是Java自身已经定义的接口规范,所以在无需了解具体的容器实现时,只需要关注Java自身对于WebSocket的实现即可;(当然在具体使用时,需要确认当前容器的版本是否支持WebSocket以及是否引入的有对应WebSocket jar等,毕竟容器才是对外socket协议的具体实现交互类,由于Tomcat以及Jetty本身的lib下是存在对应的WebSocket具体的实现jar的,所以项目中进行引用的时候,需要设置为非runtime运行时使用的jar,或者直接将对应的容器lib直接引入到项目的librares中即可)
**Java-WebSocket.jar具体是做什么?**
因为Java-WebSocket.jar是github上关于java websocket的项目start数量最多的一个项目,所以,初次使用或者不熟悉Java WebSocket的同学,一般都会直接按照Java-WebSocket的实例Demo进行socket协议的效果验证,结果在具体的J2EE web开发中,却会发现一些莫名的问题,比如:虽然我引用了Java-WebSocket.jar但最终服务跑起来后,感觉和他并没有神马关系;反而会出现很多Tomcat容器不兼容等的容器异常;那么此时则必须了解下,对应的Java-WebSocket是做什么滴了,Java-WebSocket是github上一个开源大神写的关于Java实现WebSocket的一个开源组件,使用它可以做到Java中使用WebSocket协议,但是!具体的J2EE项目中,Tomcat中所实现的WebSocket协议的具体实现,则跟当前的Java-WebSocket.jar没有一毛钱关系,换句话说,如果你肯定是基于容器去启动服务的情况下,那么要Java-webSocket.jar于不要这个Jar问题不大,因为Tomcat容器已经帮你实现了一套WebSocket的具体实现了,但是!如果你的服务
不是基于jetty,Tomcat等容器去启动的话,那么你还想实现WebSocket效果,此时的Java-WebSocket.jar则是最佳的选择,因为它可以帮你实现Main函数启动时定义WebSocket端口等一系列事情(具体可参考github地址:https://github.com/TooTallNate/Java-WebSocket)注意:Java-WebSocket.jar对socket协议的具体实现,当然也是基于Java自身的WebSocket API规范来实现的了;
Spring-WebSocket是做什么?
既然容器已经帮我们实现了关于WebSocket协议的具体实现,那么为什么我还要引入Spring-WebSocket?我要它做什么?yes,是的,如果你只是单纯的使用Tomcat所实现的WebSocket时,直接使用@ServerPoint定义WebSocket接口,然后直接使用,当然是没有问题的撒,但是!如果你的项目是基于Spring做的开发,比如你引入了SpringMVC,还引入了SpringSecurity,那么问你个问题,既然Spring已经帮你管理了Controller控制层的访问(基于请求拦截),也帮你做了SpringSecurity安全请求认证,那么,为什么你定义一个WebSocket接口,Spring就会直接帮你映射到这个WebSocket的控制器上吗?答案是:当然不会,因为SpringMVC默认是做基于Http的拦截的,如果你想使用WebSocket协议,那么你只需要引入Spring-WebSocket的jar包集就行,它会帮你查找被@ServerPoint所定义的socket接口类,然后将该类定义为Socket的实现类,当然具体的Socket协议的规范实现,还是容器帮你进行实现;除此之外,既然Socket接口也是归属于Spring管理的,那么针对Socket协议,Spring-Socket也帮你实现了一整套的安全规范,可以设置拦截,是否允许非指定的域名访问,等一系列效果;(建议深度使用Spring的项目可以引入Spring-Socket做一整套的控制,因为Spring Socket的确帮你实现了很多一整套的安全认证的功能,容器只是基于WebSocket的具体实现罢了,所以,各自分工不同,各个角色所做的事情,使用socket时,此处需要牢记,只有明白了各个角色所做的解耦合的事情后,出现异常问题,才更加方便和有思绪的进行排查;注:LZ所实现的WebSocket也是基于Spring socket的实现,网上也有一些基于Spring的项目,使用非spring-socket的实现,感兴趣的小伙伴可以试一下,Spring本身应该也是支持开启具体参数后,然后支持socket协议的控制层的直接传输,具体没有做过验证实现;不想重新搞的小伙伴直接按照上述的思路和角色开发,肯定是没毛病的; 祝各位宝宝春梦了无痕;