详解Tomcat7中WebSocket初探

2019-10-18 15:40:51于海丽

3. 服务器端WebSocket编程

Tomcat 7提供了WebSocket支持,这里就以Tomcat 7 为例,探索一下如何在服务器端进行WebSocket编程。需要加载的依赖包为 libcatalina.jar、libtomcat-coyote.jar

这里有两个重要的类 :WebSocketServlet 和 StreamInbound, 前者是一个容器,用来初始化WebSocket环境;后者是用来具体处理WebSocket请求和响应的。

编写一个Servlet类,继承自WebSocket,实现其抽象方法即可,代码如下:

package websocket; 
 
import java.util.concurrent.atomic.AtomicInteger; 
import javax.servlet.http.HttpServletRequest; 
import org.apache.catalina.websocket.StreamInbound; 
import org.apache.catalina.websocket.WebSocketServlet; 
 
public class HelloWebSocketServlet extends WebSocketServlet { 
 private static final long serialVersionUID = 1L; 
 
 private final AtomicInteger connectionIds = new AtomicInteger(0); 
 @Override 
 protected StreamInbound createWebSocketInbound(String arg0, 
   HttpServletRequest request) { 
  return new HelloMessageInbound(connectionIds.getAndIncrement(), request 
    .getSession().getId()); 
 } 
} 
package websocket; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.Reader; 
import java.nio.CharBuffer; 
import org.apache.catalina.websocket.StreamInbound; 
import org.apache.catalina.websocket.WsOutbound; 
 
public class HelloMessageInbound extends StreamInbound { 
 
 private String WS_NAME; 
 private final String FORMAT = "%s : %s"; 
 private final String PREFIX = "ws_"; 
 private String sessionId = ""; 
 
 public HelloMessageInbound(int id, String _sessionId) { 
  this.WS_NAME = PREFIX + id; 
  this.sessionId = _sessionId; 
 } 
 
 @Override 
 protected void onTextData(Reader reader) throws IOException { 
  char[] chArr = new char[1024]; 
  int len = reader.read(chArr); 
  send(String.copyValueOf(chArr, 0, len)); 
 } 
 
 @Override 
 protected void onClose(int status) { 
  System.out.println(String.format(FORMAT, WS_NAME, "closing ......")); 
  super.onClose(status); 
 } 
 
 @Override 
 protected void onOpen(WsOutbound outbound) { 
  super.onOpen(outbound); 
  try { 
   send("hello, my name is " + WS_NAME); 
   send("session id = " + this.sessionId); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
 } 
 
 private void send(String message) throws IOException { 
  message = String.format(FORMAT, WS_NAME, message); 
  System.out.println(message); 
  getWsOutbound().writeTextMessage(CharBuffer.wrap(message)); 
 } 
 
 @Override 
 protected void onBinaryData(InputStream arg0) throws IOException { 
 } 
} 

在Web.xml中进行Servlet配置:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
 <display-name>websocket demo</display-name> 
 <servlet> 
  <servlet-name>wsHello</servlet-name> 
  <servlet-class>websocket.HelloWebSocketServlet</servlet-class> 
 </servlet> 
 <servlet-mapping> 
  <servlet-name>wsHello</servlet-name> 
  <url-pattern>/websocket/say</url-pattern> 
 </servlet-mapping> 
 
 <welcome-file-list> 
  <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
</web-app>