以前做项目的时候常常会有客户端提醒的功能,使用的是ajax长轮询的方式,这中方式对服务器端压力比较大,无论有没有通知都会发送心跳请求,最近看了一下html5以及tomcat对websocket支持的相关文章,自己做了个小东东,仅供大家分享.

demo实现的小功能: 客户端A发送请求,通过服务器,直达客户端B

演示效果如图所示

代码的目录结构

package com.bw.websocket.api;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import com.bw.websocket.servlet.CallCenterMessageInBound;@Controller
public class MessageAPI {/*** 向客户端推送消息* */@ResponseBody@RequestMapping(value = "/api/send.action")public Map<String, String> send(@RequestParam String clientId,@RequestParam String message) {Map<String, String> result = new HashMap<String, String>();try {CallCenterMessageInBound.send(clientId, message);result.put("message", "success");} catch (IOException e) {result.put("message", e.getLocalizedMessage());e.printStackTrace();}return result;}
}
package com.bw.websocket.servlet;import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.HashMap;
import java.util.Map;import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;public class CallCenterMessageInBound extends MessageInbound {private String clientId;public static final Map<String, MessageInbound> socketList = new HashMap<String, MessageInbound>();public static void send(String clientId, String message) throws IOException {MessageInbound messageInbound = socketList.get(clientId);messageInbound.getWsOutbound().writeTextMessage(CharBuffer.wrap(message));messageInbound.getWsOutbound().flush();}public CallCenterMessageInBound(String clientId) {this.clientId = clientId;}@Overrideprotected void onBinaryMessage(ByteBuffer message) throws IOException {}@Overrideprotected void onTextMessage(CharBuffer message) throws IOException {}@Overrideprotected void onOpen(WsOutbound outbound) {socketList.put(clientId, this);}@Overrideprotected void onClose(int status) {socketList.remove(clientId);}
}
package com.bw.websocket.servlet;import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.HashMap;
import java.util.Map;import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;public class CallCenterMessageInBound extends MessageInbound {private String clientId;public static final Map<String, MessageInbound> socketList = new HashMap<String, MessageInbound>();public static void send(String clientId, String message) throws IOException {MessageInbound messageInbound = socketList.get(clientId);messageInbound.getWsOutbound().writeTextMessage(CharBuffer.wrap(message));messageInbound.getWsOutbound().flush();}public CallCenterMessageInBound(String clientId) {this.clientId = clientId;}@Overrideprotected void onBinaryMessage(ByteBuffer message) throws IOException {}@Overrideprotected void onTextMessage(CharBuffer message) throws IOException {}@Overrideprotected void onOpen(WsOutbound outbound) {socketList.put(clientId, this);}@Overrideprotected void onClose(int status) {socketList.remove(clientId);}
}
<%@ 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">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-2.0.2.min.js"></script>
<script type="text/javascript">
var clientId =Math.random();
var url = 'ws://localhost:8080/websocket/WebSocket?clientId='+clientId;
document.write("Current ClientId:"+clientId);
var CallCenter = {init:function(url){var _websocket = new WebSocket(url);_websocket.onopen = function(evt) {console.log("Connected to WebSocket server.");};_websocket.onclose = function(evt) {console.log("Disconnected");};_websocket.onmessage = function(evt) {eval(evt.data);};_websocket.onerror = function(evt) {console.log('Error occured: ' + evt);};}
};
CallCenter.init(url);$(document).ready(function(){$("#send").bind("click",function(){$.ajax({type: "get",url: "api/send.action",data: "clientId="+$("#clientId").val()+"&message="+$("#message").val(),success: function(msg){alert(msg.message);}});});
});
</script>
</head>
<body>
<br/>
To ClientId:<input type="text" id="clientId" /><br /> Message:<input type="text" id="message" /><input type="button" id="send" value="send">
</body>
</html>

home.jsp 监控客户端连接

<%@page import="com.bw.websocket.servlet.CallCenterMessageInBound"%>
<%@page import="java.util.Iterator"%>
<%@page import="org.apache.catalina.websocket.MessageInbound"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%for(Iterator<String> it = CallCenterMessageInBound.socketList.keySet().iterator();it.hasNext();){String key = it.next();out.println(key+":"+CallCenterMessageInBound.socketList.get(key)+"<br/>");}
%>
this home page
</body>
</html>

上述方法只对高版本的浏览器使用,也就是支持websocket的浏览器适用

考虑到浏览器的兼容性问题,我们还可以使用flash socket的方式进行消息推送,通过flex javascript bridge来执行服务器端推送信息.

使用WebSocket推送服务器消息相关推荐

  1. 抓取WebSocket推送的消息

    介绍 很多直播或对数据及时性要求比较高的网站,使用了WebSocket.这种数据要怎么抓呢? 我们这里以socket.io为例,我们可以查看网站网页源代码看使用的H5的WebSocket还是socke ...

  2. Springboot整合Websocket(推送消息通知)

    在手机上相信都有来自服务器的推送消息,比如一些及时的新闻信息,这篇文章主要就是实现这个功能,只演示一个基本的案例.使用的是websocket技术. 一.什么是websocket WebSocket协议 ...

  3. Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务

    Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务_IT_ziliang的博客-CSDN博客 WebSocket是一种在单个TCP连接上进行全双工 ...

  4. 消息推送服务器推pc,PC浏览器消息实时推送的解决方案 ——EPush推送平台

    原标题:PC浏览器消息实时推送的解决方案 --EPush推送平台 陈华 研发工程师,2014入职去哪儿网.参与研发的EPush推送平台,增强了订单推送的时效性,提高了酒店自助订单处理率.最近负责CEQ ...

  5. mpush 搭建消息服务器,MPUSH消息推送服务器搭建

    MPUSH消息推送服务器搭建 安装JDK 1.8 wget /jdk-8u121-linux-x64.tar.gz tar -zxvf jdk-8u121-linux-x64.tar.gz vim / ...

  6. win10消息推送服务器,怎么让win10推送

    近有Win7系统用户反映,自Win10版本发布以来,身边的朋友都已经升级了Win10了,可是自己至今都没收到Win10升级的推送通知,今天学习啦小编给大家介绍下怎么让win10推送通知吧. 让win1 ...

  7. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  8. 【苹果推IM,苹果iMessage相册推】当Apple APNS推送服务器从您的应用程序接吸取注册消息时,它将为您回到一串devicetoken(很是重要)

    推荐内容IMESSGAE相关 作者✈️@IMEAE推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者✈️@IMEAE推荐内容 1.家庭推内容 *** 点击即可查看作者要求 ...

  9. iOS 推送手机消息背后的技术

    作者:allenzzhao,腾讯  IEG运营开发工程师 消息推送我们几乎每天都会用到,但你知道iOS中的消息推送是如何实现的吗?本文将从推送权限申请,到本地和远程消息推送,再到App对推送消息的处理 ...

最新文章

  1. 哈希加密:MD5()
  2. 整数转换为罗马数字 Integer to Roman
  3. Node.js 系列:构建原生 Node.js 应用
  4. OpenGL ES 3.0 基础知识
  5. python编程需要什么软件-《》 学习python编程需要安装哪些软件?
  6. 【C 语言】二级指针作为输入 ( 指针数组 | 复杂指针解读 )
  7. Python应用实战案例-Pythongeopandas包详解(附大量案例及代码)
  8. python 零代码快速开发平台_现在低代码开发平台和零代码平台区别是什么?
  9. mysql set语句_mysql--乱码解决(6)
  10. Serverless在大规模数据处理的实践
  11. java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?
  12. 在shell中如何判断一个变量是否为空
  13. arduino支持python吗_python能给arduino的板子编程吗?stm32支持吗?什么游戏引擎支持python?...
  14. java基础知识点整理一
  15. 使用vue搭建项目(创建手脚架)
  16. 如何去除图片背景变透明?透明背景图片怎么做?
  17. sublime text2-text3 定义的不同浏览器的预览快捷键
  18. html5均线图源码,通达信相当好的天机均线主图源码
  19. 通过百度地图实现定位并获取本地当日天气信息
  20. 【论文阅读】基于混淆的加强网络安全的方法

热门文章

  1. 哈斯HASS数控系统CNC数据采集
  2. stc51单片机入门 c语言,STC51单片机入门 (C语言)
  3. 计算机取证工具应用-数据恢复(实验部分)
  4. 实验教学管理系统java源代码_基于jsp的实验教学管理系统-JavaEE实现实验教学管理系统 - java项目源码...
  5. 基于I2C协议的EEPROM驱动控制(笔记整理)
  6. 用Annchain,加分
  7. 如何听节拍器_二胡初学者如何使用节拍器? | 乐器教程网
  8. 2014年9月4日新GRE真题回忆
  9. carsim与simulink联合仿真注意事项
  10. 【C、C++系列-10】C语言实现:百钱买百鸡问题