基于websocket-api.jar的websocket server服务

HTML5不仅提供了更加炫酷的系统资源的调用,也带来了websocket这一全双工的通信方式。再此之前,前端页面与服务端的通信基本只能依赖http协议进行短连接。为了能实现长连接的效果,多采用前端主动轮询的方式,持续从服务端拉取信息。虽说后来诞生了推送机制,但应用范围并不是十分广泛,而且性能较低。而websocket通信提供了另一种简单可靠而且效率更高的方式,weboscket通信只在建立连接是传递头信息,而在客户端提交与服务端推送信息时,是没有头信息传递的。而且,建立websocket连接后,服务端可以择时进行消息的主动推送。

本文介绍的是基于tomcat中自带jar包websocket-api.jar与html5内置对象WebSocket的服务端与浏览器客户端的通信demo。

一、java服务端websocket-server-demo示例

此示例的java服务端项目为pom项目,有关pom项目的内容,将在后续文章中介绍。下面介绍下weboscket-server-demo项目的几个主要文件。

1.pom项目配置文件(pom.xml)

添加依赖的jar包

<!-- tomcat websocket-api -->
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
    </dependency>
<!-- tomcat websocket-api -->

添加依赖tomcat插件

<!-- apache tomcat maven plugin -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <uriEncoding>UTF-8</uriEncoding>
            <port>8082</port>
            <path>/websocket-server</path>
        </configuration>
    </plugin>
<!-- //apache tomcat maven plugin -->

2.weboskcet服务端WebsocketAPI.java类文件

/**
 * websocket server<br>
 * 
 * <code>ServerEndpoint</code> API:
 * http://docs.oracle.com/javaee/7/api/javax/websocket/server/
 * ServerEndpoint.html
 * 
 * @author Administrator
 *
 */
@ServerEndpoint(value = "/wsApi/{actCode}")
public class WebsocketAPI {
 /**
  * This method level annotation can be used to decorate a Java method that
  * wishes to be called when a new web socket session is open.<br>
  * 
  * <code>OnOpen</code> API:
  * http://docs.oracle.com/javaee/7/api/javax/websocket/OnOpen.html
  * 
  * @param session
  * @param config
  * @param actCode
  */
 @OnOpen
 public void onOpen(Session session, EndpointConfig config,
   @PathParam("actCode") String actCode) {
  System.out.println("actCode=" + actCode + ":onOpen");
 }
 /**
  * This method level annotation can be used to make a Java method receive
  * incoming web socket messages. <br>
  * 
  * <code>nMessage</code> API:
  * http://docs.oracle.com/javaee/7/api/javax/websocket/OnMessage.html
  * 
  * @param message
  * @param session
  * @param actCode
  */
 @OnMessage
 public void onMessage(String message, Session session,
   @PathParam("actCode") String actCode) {
  System.out.println("actCode=" + actCode + ":onMessage," + message);
  /**
   * reply message
   */
  try {
   session.getBasicRemote().sendText("copy that!");
  } catch (IOException e) {
   System.out.println("actCode=" + actCode + ":reply error!");
   e.printStackTrace();
  }
 }
 /**
  * This method level annotation can be used to decorate a Java method that
  * wishes to be called in order to handle errors. <br>
  * 
  * <code>OnError</code> API:
  * http://docs.oracle.com/javaee/7/api/javax/websocket/OnError.html
  * 
  * @param session
  * @param e
  * @param actCode
  */
 @OnError
 public void onError(Session session, Throwable e,
   @PathParam("actCode") String actCode) {
  System.out.println("actCode=" + actCode + ":onError");
  e.printStackTrace();
 }
 /**
  * This method level annotation can be used to decorate a Java method that
  * wishes to be called when a web socket session is closing.<br>
  * 
  * <code>OnClose</code> API:
  * http://docs.oracle.com/javaee/7/api/javax/websocket/OnClose.html
  * 
  * @param session
  * @param cr
  * @param actCode
  */
 @OnClose
 public void onClose(Session session, CloseReason cr,
   @PathParam("actCode") String actCode) {
  System.out.println("actCode=" + actCode + ":onClose");
 }
}

 注:当前websocket接口路径为”ws://localhost:8082/websocket-server/wsApi/test” 

二、html5客户端示例

以下为html页面中的关键JavaScript代码。

//websocket server URIs
  var uri = "ws://localhost:8082/websocket-server/wsApi/test";
  //create websocket
  var ws = new WebSocket(uri);
  //open a websocket and send message
  ws.onopen = function(ev) {
   ws.send("hello,first websocket");
  };
  //receive a message and close it
  ws.onmessage = function(ev) {
   console.log(ev.data);
   ws.close();
  };
  //error
  ws.onerror = function(ev) {
   console.log("error");
  };
  //close this websocket
  ws.onclose = function(ev) {
   console.log("close");
  }

© 2016, 李德涛博客. 版权所有.

发表评论

电子邮件地址不会被公开。 必填项已用*标注