服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - Tomcat - Tomcat实现WebSocket的方法

Tomcat实现WebSocket的方法

2021-08-15 21:38汪洋之舟---seaboat Tomcat

WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信。这篇文章主要介绍了Tomcat实现WebSocket的方法的相关资料,需要的朋友可以参考下

 websocket协议属于html5标准,越来越多浏览器已经原生支持websocket,它能让客户端和服务端实现双向通信。在客户端和服务器端建立一条websocket连接后,服务器端消息可直接发送到客户端,从而打破传统的请求响应模式,避免了无意义的请求。比如传统的方式可能会使用ajax不断请求服务器端,而websocket则可以直接发送数据到客户端且客户端不必请求。同时,由于有了浏览器的原生支持,编写客户端应用程序也变得更加便捷且不必依赖第三方插件。另外,websocket协议摒弃了http协议繁琐的请求头,而是以数据帧的方式进行传输,效率更高。

图为websocket协议通信的过程,首先客户端会发送一个握手包告诉服务器端我想升级成websocket,不知道你服务器端是否同意,这时如果服务器端支持websocket协议则会返回一个握手包告诉客户端没问题,升级已确认。然后就成功建立起了一条websocket连接,该连接支持双向通信,并且使用websocket协议的数据帧格式发送消息。

Tomcat实现WebSocket的方法

握手过程需要说明下,为了让websocket协议能和现有http协议web架构互相兼容,所以websocket协议的握手要基于http协议,比如客户端会发送类似如下的http报文到服务器端请求升级为websocket协议,其中包含的upgrade: websocket就是告诉服务器端我想升级协议:

?
1
2
3
4
5
6
7
get ws://localhost:8080/hello http/1.1
origin: http://localhost:8080
connection: upgrade
host: localhost:8080
sec-websocket-key: urovsczjnol/umbtt5ukmw==
upgrade: websocket
sec-websocket-version: 13

此时如果服务器端支持websocket协议,则它会发送一个同意客户端升级协议的报文,具体报文类似如下,其中upgrade: websocket就是告诉客户端我同意你升级协议:

?
1
2
3
4
5
6
http/1.1 101 websocket protocol handshake
date: fri, 10 feb 2016 17:38:18 gmt
connection: upgrade
server: kaazing gateway
upgrade: websocket
sec-websocket-accept: rlhckw/skso9gah/zsfhbatdkru=

完成如上握手后,http协议连接就被打破,接下去则是开始使用websocket协议进行双方通信,这条连接还是原来的那条tcp/ip连接,端口也还是原来的80或443。

下面举一个tomcat中编写websocket的简单例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class hellowebsocketservlet extends websocketservlet {
private static list<messageinbound> socketlist = new arraylist<messageinbound>();
protected streaminbound createwebsocketinbound(string subprotocol,httpservletrequest request){
return new websocketmessageinbound();
}
public class websocketmessageinbound extends messageinbound{
protected void onclose(int status){
super.onclose(status);
socketlist.remove(this);
}
protected void onopen(wsoutbound outbound){
super.onopen(outbound);
socketlist.add(this);
}
@override
protected void onbinarymessage(bytebuffer message) throws ioexception {
}
@override
protected void ontextmessage(charbuffer message) throws ioexception {
for(messageinbound messageinbound : socketlist){
charbuffer buffer = charbuffer.wrap(message);
wsoutbound outbound = messageinbound.getwsoutbound();
outbound.writetextmessage(buffer);
outbound.flush();
}
}
}
}

这个servlet必须要继承websocketservlet,接着创建一个继承messageinbound的websocketmessageinbound类,在该类中填充onclose、onopen、onbinarymessage和ontextmessage等方法即可完成各个事件的逻辑,其中onopen会在一个websocket连接建立时被调用,onclose会在一个websocket关闭时被调用,onbinarymessage则是binary方式下接收到客户端数据时被调用,ontextmessage则是text方式下接收到客户端数据时被调用。上面一段代码实现了一个广播的效果。

按照上面的处理逻辑,tomcat对websocket的集成就不会太难了,就是在处理请求时如果遇到websocket协议请求则做特殊处理,保持住连接并在适当的时机调用websocketservlet的messageinbound的onclose、onopen、onbinarymessage和ontextmessage等方法。由于websocket一般建议在nio模式下使用,所以看看nio模式集成websocket协议。

如图,对于websocket的客户端连接被接收器接收后注册到niochannel队列中,poller组件不断轮休是否有niochannel需要处理,如果有则经过处理管道后进到继承了websocketservlet的servlet上,websocketservlet的doget方法会处理websocket握手,告诉返回客户端同意升级协议。往后poller继续不断轮休相关niochannel,一旦发现是使用websocket协议的管道则会调用messageinbound的相关方法,完成不同事件的处理,从而实现对websocket协议的支持。

Tomcat实现WebSocket的方法

原文链接:http://blog.csdn.net/wangyangzhizhou/article/details/53331299

延伸 · 阅读

精彩推荐
  • TomcatEclipse创建tomcat实现过程原理详解

    Eclipse创建tomcat实现过程原理详解

    这篇文章主要介绍了Eclipse创建tomcat实现过程原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    海绵般汲取11642021-09-16
  • TomcatTomcat服务器的安全设置

    Tomcat服务器的安全设置

    tomcat是一个开源Web服务器,基于Tomcat的Web运行效率高,可以在一般的硬件平台上流畅运行,因此,颇受Web站长的青睐。不过,在默认配置下其存在一定的安...

    IT专家网9002021-08-03
  • TomcatTomcat CentOS安装实现过程图解

    Tomcat CentOS安装实现过程图解

    这篇文章主要介绍了Tomcat CentOS安装实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考...

    agrin5842021-09-15
  • TomcatTomcat整体结构简单介绍

    Tomcat整体结构简单介绍

    这篇文章主要介绍了Tomcat整体结构简单介绍,Tomcat的本质是一个Servlet容器。一个Servlet能做的事情是:处理请求资源,并为客户端填充response对象,需要的朋友...

    叫我田露也行12302021-09-07
  • Tomcat如何查看tomcat的控制台输出的方法

    如何查看tomcat的控制台输出的方法

    这篇文章主要介绍了如何查看tomcat的控制台输出的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    CaiCaiNeo11932021-08-29
  • Tomcat一次tomcat源码启动控制台中文乱码的调试过程记录

    一次tomcat源码启动控制台中文乱码的调试过程记录

    平时在使用tomcat做一些服务的时候经常遇到各种乱码问题,下面这篇文章主要给大家介绍了一次tomcat源码启动控制台中文乱码的调试过程,需要的朋友可以...

    zhoutaoping199211852021-09-24
  • Tomcat解决Tomcat的maxPostSize属性的配置需要注意的问题

    解决Tomcat的maxPostSize属性的配置需要注意的问题

    这篇文章主要介绍了解决Tomcat的maxPostSize属性的配置需要注意的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    life is wonderful12012021-09-13
  • TomcatTomcat安装配置方法图文教程

    Tomcat安装配置方法图文教程

    这篇文章主要为大家详细介绍了Tomcat安装配置方法图文教程,java环境变量如何配置,Eclipse安装配置方法图文教程 ,为大家分享了三个教程,感兴趣的小伙...

    Tomcat教程网13292021-08-11