WebSocket分析及实践( 三 )


WebSocket JavaScript API接口
针对 Web 开发人员的 WebSocket JavaScript 客户端接口是非常简单的,以下是 WebSocket JavaScript 接口的定义:

WebSocket分析及实践

文章插图
 
 
其中 URL 属性代表 WebSocket 服务器的网络地址,协议通常是”ws”,send 方法就是发送数据到服务器端,close 方法就是关闭连接 。除了这些方法,还有一些很重要的事件:onopen,onmessage,onerror 以及 onclose 。
##WebSocket实战—系统即时提醒
在上一节中我们说到使用WebSocket需要客户端和服务器端,客户端通常就是浏览器(基于浏览器进行的JavaScript调用),服务器端通常就是支持WebSocket的中间件 。本节中我们将进行一个WebSocket实战—系统即时提醒(使用Chrome + Tomcat7.0.70,在此基础上进行前后端代码开发),后端模拟业务变化,向前端实时推送提醒消息,前端页面进行消息提醒的实时展示 。
  • WebSocket客户端代码(基于Jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src=https://www.isolves.com/it/cxkf/jiagou/2019-08-15/"js/jquery-1.7.2.min.js">系统即时提醒_江苏龙网 
  • WebSocket服务器端代码(基于Java)
package com.itheima.ssm.controller;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.*;import javax.websocket.server.ServerEndpoint;/** * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端 */@ServerEndpoint("/websocket")public class WebSocketTest { //静态变量,用来记录当前在线连接数 。应该把它设计成线程安全的 。private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象 。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 public static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法 * @param session 可选的参数 。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session session){ this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线客户端数加1 System.out.println("有新连接加入!当前在线客户端数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(){ webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线客户端数减1 System.out.println("有一连接关闭!当前在线客户端数为" + getOnlineCount()); }/** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session 可选的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); error.printStackTrace(); } /** * 这个方法与上面几个方法不一样 。没有用注解,是根据自己需要添加的方法 。* @param message * @throws IOException */ public void sendMessage(String message) throws IOException{ this.session.getBasicRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketTest.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketTest.onlineCount--; }}


推荐阅读