鍍金池/ 教程/ Linux/ WebSocket 支持
連接器
JSPs
重寫機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫
安裝
MBean 描述符
JNDI 資源
類加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫
負(fù)載均衡器
安全管理
附加組件
監(jiān)控與管理
Windows 服務(wù)
集群化與會(huì)話復(fù)制
高級 IO 機(jī)制
SSI(服務(wù)器端嵌入)
WebSocket 支持
JDBC 數(shù)據(jù)源
日志機(jī)制
默認(rèn) Servlet
SSL/TLS 配置
Tomcat 的 JDBC 連接池
第一個(gè)應(yīng)用
簡介
Realm 配置

WebSocket 支持

簡介

Tomcat 支持由 RFC 6455 所定義的 WebSocket。

應(yīng)用開發(fā)

Tomcat 實(shí)現(xiàn)由 JSR-356 定義的 Java WebSocket 1.1 API。

關(guān)于 WebSocket API 的使用方法,可查看相關(guān)范例,既需要查看客戶端 HTML 代碼,也需要查看服務(wù)器代碼。

生產(chǎn)用途

雖然 WebSocket 實(shí)現(xiàn)可以和任何 HTTP 連接器一起使用,但并不建議和 BIO HTTP 連接器一起使用,因?yàn)?WebSocket 典型用途(大量連接很多時(shí)候都是空閑的)并不是很適合 HTTP BIO 連接器,因?yàn)樵撨B接器需要不管連接是否空閑,每個(gè)連接都應(yīng)該分配一個(gè)線程。

目前,已有報(bào)告(56304)發(fā)現(xiàn),Linux 會(huì)用大量時(shí)間來報(bào)告刪除的連接。當(dāng)利用 BIO HTTP 連接器使用 WebSocket 時(shí),當(dāng)在這段時(shí)間內(nèi)寫入時(shí),就容易產(chǎn)生線程阻塞。這似乎不是一種理想的解決方案。使用內(nèi)核網(wǎng)絡(luò)參數(shù) /proc/sys/net/ipv4/tcp_retries2,可以減少報(bào)道刪除的連接所花費(fèi)的時(shí)間?;蛘呖梢赃x擇另一種 HTTP 連接器,因?yàn)樗鼈兪褂玫氖欠亲枞?IO,從而能讓 Tomcat 實(shí)現(xiàn)自己的超時(shí)機(jī)制來解決這些問題。

Tomcat WebSocket 特定配置

Tomcat 為 WebSocket 提供了一些 Tomcat 專有配置選項(xiàng)。這些配置將來有望能進(jìn)入 WebSocket 正式規(guī)范中。

以阻塞模式發(fā)送 WebSocket 消息所用的寫入超時(shí)默認(rèn)值為 20000 毫秒(20 秒)。通過設(shè)定連接到 WebSocket 會(huì)話的用戶屬性集合中的 org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT 屬性,我們可以修改這個(gè)寫入超時(shí)屬性值。該屬性值類型應(yīng)該為 Long,以毫秒表示所用的超時(shí)時(shí)間,-1 表示超時(shí)無限。

如果應(yīng)用沒有為傳入的二進(jìn)制消息定義 MessageHandler.Partial,那么必須先對任何傳入的二進(jìn)制消息進(jìn)行緩存,繼而可以通過調(diào)用一個(gè)已注冊專用于處理二進(jìn)制消息的 MessageHandler.Whole 來傳遞整個(gè)消息。默認(rèn)用于二進(jìn)制消息的緩存容量是 8192 字節(jié)。在應(yīng)用中,將servlet 上下文初始參數(shù) org.apache.tomcat.websocket.binaryBufferSize 設(shè)置為期望的字節(jié)值,就能修改這個(gè)緩存容量。

如果應(yīng)用沒有為傳入的文本消息定義 MessageHandler.Partial,那么必須先對任何傳入的文本消息進(jìn)行緩存,繼而可以通過調(diào)用一個(gè)已注冊專用于處理文本消息的 MessageHandler.Whole 來傳遞整個(gè)消息。默認(rèn)用于文本消息的緩存容量是 8192 字節(jié)。在應(yīng)用中,將servlet 上下文初始參數(shù) org.apache.tomcat.websocket.textBufferSize 設(shè)置為期望的字節(jié)值,就能修改這個(gè)緩存容量。

Java WebSocket 規(guī)范 1.0 并不允許第一個(gè)服務(wù)端點(diǎn)開始 WebSocket 握手之后進(jìn)行程序性部署。默認(rèn)情況下,Tomcat 繼續(xù)允許額外的程序性部署。這一行為是通過 servlet 上下文初始化參數(shù) org.apache.tomcat.websocket.noAddAfterHandshake 來控制的。將系統(tǒng)屬性 org.apache.tomcat.websocket.STRICT_SPEC_COMPLIANCE 變?yōu)?true,可以改變默認(rèn)值,但是 servlet 上下文中的顯式設(shè)置卻總是優(yōu)先的。

Java WebSocket 規(guī)范 1.0 要求,異步寫操作的回調(diào)所在的線程應(yīng)不同于初始化寫操作的線程。因?yàn)槿萜骶€程池并未通過 Servlet API 暴露出來,所以 WebSocket 實(shí)現(xiàn)必須提供自己的線程池。這種線程池通過下列 Servlet 上下文初始化參數(shù)來控制:

  • org.apache.tomcat.websocket.executorCoreSize:executor 線程池的核心容量大小。如果不設(shè)置,則采用默認(rèn)值 0。注意,executor 線程池最大允許容量被硬編碼至 Integer.MAX_VALUE,實(shí)際上可以認(rèn)為該值是無限的。
  • org.apache.tomcat.websocket.executorKeepAliveTimeSeconds:在終止前,空閑線程在 executor 線程池中留存的最長時(shí)間。如未指定,則采用默認(rèn)的 60 秒。

在使用 WebSocket 客戶端來連接服務(wù)端點(diǎn)時(shí),建立該連接的 IO 超時(shí)是通過提供的 javax.websocket.ClientEndpointConfiguserProperties 來控制的。該屬性是 org.apache.tomcat.websocket.IO_TIMEOUT_MS,是以字符串形式表示的超時(shí)時(shí)間(以毫秒計(jì)),默認(rèn)為 5000(5 秒)。

在使用 WebSocket 客戶端來連接安全的服務(wù)端點(diǎn)時(shí),客戶端 SSL 配置是通過提供的 javax.websocket.ClientEndpointConfiguserProperties 來控制的。提供以下用戶屬性:

  • org.apache.tomcat.websocket.SSL_CONTEXT
  • org.apache.tomcat.websocket.SSL_PROTOCOLS
  • org.apache.tomcat.websocket.SSL_TRUSTSTORE
  • org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD

默認(rèn)的信任存儲密碼(truststore password)為:changeit。

如果設(shè)置了 org.apache.tomcat.websocket.SSL_CONTEXT 屬性,則將忽略這兩個(gè)屬性:org.apache.tomcat.websocket.SSL_TRUSTSTOREorg.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD。

上一篇:安全管理下一篇:JNDI 資源