Javax.WebSocket详解

发布时间:2023-05-20

一、WebSocket技术简介

WebSocket是一种网络通信协议,提供双向通信功能。它建立在TCP协议之上,通过HTTP的握手阶段进行握手,然后建立起基于帧的通信。

WebSocket比起HTTP有更少的控制开销,可以在客户端和服务器端同时发送数据,同时减少了延迟和带宽,使得网页可以更快地响应用户的交互操作。

由于其双向通信的特性,WebSocket可以广泛应用于在线游戏、在线协议设计、实时通讯等领域。

二、javax.websocket概述

javax.websocket是Java EE 7标准中新增的api,主要是为了方便Java开发者使用WebSocket。它提供了一组Java工具类和接口,帮助Java开发者开发WebSocket应用。

它包含两个核心部分:客户端API和服务器API。它们都是使用标准的Java类和注释开发的,适用于任何支持WebSocket的服务器端和客户端环境。

服务器端API包括Endpoint、Session、MessageHandler、Decoder、Encoder等,这些都是实现WebSocket服务端的基本元素;客户端API包括WebSocketContainer、ClientEndpointConfig、DeploymentConfig和ClientEndpoint等,这些都是实现WebSocket客户端的基本元素。

三、WebSocket连接建立

在使用javax.websocket进行开发时,WebSocket会默认使用浏览器提供的JS API进行连接建立。在服务端也需要提供相应的Endpoint类来处理JS前端发起的WebSocket连接请求。下面是一个简单的WebSocket连接建立的例子:

@ServerEndpoint("/echo")
public class EchoEndpoint {
    @OnMessage
    public void onMessage(Session session, String message) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其中,@ServerEndpoint注解表示这是一个WebSocket服务端,/echo表示WebSocket通信的路径。通过@OnMessage注解声明了一个处理信息的方法,当WebSocket通信时,就会自动触发这个方法。在这个例子中,当客户端发送消息时,服务端会把它原封不动地返回给客户端。

四、WebSocket消息处理

WebSocket的消息处理部分,包括了Decoder、Encoder和MessageHandler这三个重要的接口。

Decoder接口用于将接收到的字符串或码流转换为目标类型的Java对象。Encoder接口则用于把Java对象转换成字符串或码流。

MessageHandler则是用于处理数据的接口,WebSocket客户端和服务端都可以使用它。当WebSocket接收到数据时,会自动调用MessageHandler的onMessage方法。下面是一个简单的MessageHandler的例子:

public class MyMessageHandler implements MessageHandler.Whole<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("Received: " + message);
    }
}

这里定义了一个实现MessageHandler接口的类MyMessageHandler,指定了它的泛型为String。当WebSocket接收到数据时,就会自动触发这个onMessage方法,输出接收到的内容。

五、WebSocket与Tomcat集成

Tomcat是目前应用最广泛的JavaWeb服务器,与javax.websocket整合需要以下步骤:

(1)添加依赖:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
</dependency>

(2)编写Endpoint:

@ServerEndpoint(value = "/websocket")
public class MyEndpoint {
    @OnOpen
    public void onOpen(Session session){
        System.out.println("WebSocket opened: " + session.getId());
    }

    @OnClose
    public void onClose(Session session){
        System.out.println("WebSocket closed: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session){
        System.out.println("WebSocket message: " + message);
        try {
            session.getBasicRemote().sendText("Server response: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(3)在web.xml中配置WebSocket:

<web-app>
    <display-name>WebSocket Server&Client Sample</display-name>

    <!-- WebSocket Servlet Mapping -->
    <servlet>
        <servlet-name>websocket</servlet-name>
        <servlet-class>org.apache.tomcat.websocket.server.WsServlet</servlet-class>
        <init-param>
            <param-name>org.apache.tomcat.websocket.servlet.URI_MATCHER_ID</param-name>
            <param-value>websocket</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>websocket</servlet-name>
        <url-pattern>/websocket/*</url-pattern>
    </servlet-mapping>
</web-app>

(4)使用JS API建立WebSocket连接:

var ws = new WebSocket("ws://localhost:8080/MyApp/websocket");

ws.onopen = function(event) {
    console.log("WebSocket opened: " + ws.readyState);
}
ws.onclose = function(event) {
    console.log("WebSocket closed: " + ws.readyState);
}
ws.onmessage = function(event) {
    console.log("WebSocket message: " + event.data);
    ws.send(event.data);
}

六、总结

从WebSocket技术简介、javax.websocket概述、WebSocket连接建立、WebSocket消息处理和WebSocket与Tomcat集成这几个方面详细介绍了javax.websocket的原理和使用方法。javax.websocket可以帮助Java开发者轻松地构建WebSocket应用,拥有快速和高效的双向通信能力。