拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能
一、写在前面
要求做一个,后台发布信息,前台能即时得到通知的消息推送功能。网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket。表示除了定时询问外,就websocket相对简单点。
二、实现
实现类java代码:
package cn.xm.mall.websocket.controller;import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set;import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest;import org.apache.catalina.websocket.MessageInbound; import org.apache.catalina.websocket.StreamInbound; import org.apache.catalina.websocket.WebSocketServlet; import org.apache.catalina.websocket.WsOutbound;@WebServlet("/webSocket.do") public class WebSocketServletController extends WebSocketServlet {private final Map<Integer, WsOutbound> map = new HashMap<Integer, WsOutbound>();private static final long serialVersionUID = -1058445282919079067L;@Overrideprotected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request) {// StreamInbound:基于流的WebSocket实现类(带内流),应用程序应当扩展这个类并实现其抽象方法onBinaryData和onTextData。return new ChatMessageInbound();}class ChatMessageInbound extends MessageInbound {// MessageInbound:基于消息的WebSocket实现类(带内消息),应用程序应当扩展这个类并实现其抽象方法onBinaryMessage和onTextMessage。 @Overrideprotected void onOpen(WsOutbound outbound) {map.put(outbound.hashCode(), outbound);super.onOpen(outbound);}@Overrideprotected void onClose(int status) {map.remove(getWsOutbound().hashCode());super.onClose(status);}@Overrideprotected void onBinaryMessage(ByteBuffer buffer) throws IOException {}@Overrideprotected void onTextMessage(CharBuffer buffer) throws IOException {String msg = buffer.toString();Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");//msg = " <font color=green>匿名用戶 " + sdf.format(date) + "</font><br/> " + msg; broadcast(msg);}private void broadcast(String msg) {Set<Integer> set = map.keySet();for (Integer integer : set) {WsOutbound outbound = map.get(integer);CharBuffer buffer = CharBuffer.wrap(msg);try {outbound.writeTextMessage(buffer);outbound.flush();} catch (IOException e) {e.printStackTrace();}}}} }
前台连接websocket 代码 写到了js里,页面直接引用,就和websocket连通了。
/** * WebSocket消息推送 * @Copyright Copyright (c) 2006 * @author Guapo * @see DESCore */ $(function() {var loginNameCookie=$.cookie('memberInfo');if(typeof(loginNameCookie) == "undefined" || loginNameCookie==null || loginNameCookie==''){}else{chat();}});var socket;var chat = function() {socket = new WebSocket('ws://XXXXX/webSocket.do');socket.onopen = function(event) {console.info("<font color=green>连接成功!</font>");};socket.onmessage = function(event) {if("pms"==event.data){appendInsideLetter();//这里是后台send一个pms参数类型,前台得知后,异步查询后台通知的资讯,然后页面通知动作的方法}};socket.onclose = function(event) {console.info("<font color=green>连接断开!</font>");};if (socket == null) {console.info("<font color=green>连接失败!</font>");}};var send = function() {
后台同理和前台连接同一个websoket后。在发布完信息后,调用一下send方法。代码如下
var socket;var chat = function() {socket = new WebSocket('ws://www.simaakj.com/webSocket.do');socket.onopen = function(event) {console.info("<font color=green>连接成功!</font>");send();//后台连接的时候,就通知了一下。 };socket.onmessage = function(event) {};socket.onclose = function(event) {console.info("<font color=green>连接断开!</font>");};if (socket == null) {console.info("<font color=green>连接失败!</font>");}};var send = function() {socket.send("pms");}
后台操作完,调用 chat();既可推送告知前台成功。
三、遇到的问题,总结
0、The hierarchy of the type MyMessageInbound is inconsistent。一开始遇到这个问题,原因是缺少包,不仅仅需要tomcat中的catalina.jar以及websocket-api.jar。还需要tomcat-coyote-7.0.27.jar
1、以上代码放到本地后,开发发现连不上,发现需要在登录过滤把webSocket.do去掉,去掉之后,本地运行好使了。
2、放到环境中后,发现又有问题,原来是环境用到了Nginx,导致websoket不好使,百度了下解决办法,在Nginx配置中加入以下代码,就好使了。
我是在reverse-proxy.conf中添加的
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
转载于:https://www.cnblogs.com/minzhousblogs/p/7838083.html
拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能相关推荐
- WebSocket实现android消息推送
WebSocket实现android消息推送 WebSocket是HTML5出的协议,基于TCP.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. Web ...
- Worktile 中百万级实时消息推送服务的实现
Worktile 中百万级实时消息推送服务的实现 转自:http://www.360doc.com/content/15/0907/19/1073512_497529854.shtml 这是一个创建于 ...
- Worktile中百万级实时消息推送服务的实现
Worktile中百万级实时消息推送服务的实现 出自:http://blog.jobbole.com/81125/ 转载于:https://www.cnblogs.com/ribavnu/p/4531 ...
- 基于SpringBoot、RabbitMQ的Android消息推送平台搭建
消息推送,类似于微信来新消息时出现在通知栏那种情景.很多APP都有这个功能.现在有很多第三方平台可以实现这个需要,但是有的公司对所要推送的消息保密要求比较高,不希望被第三方看到,可以使用此种方式进行消 ...
- springboot整合websocket实现一对一消息推送和广播消息推送
springboot基础环境,请参考springboot文档 maven依赖 <dependency><groupId>org.springframework.boot< ...
- 浅析即时通讯开发中移动端实时消息推送技术
实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能终端真正成为全时信息传播的工具.本文将从移动端无线网络的特点来谈谈实时消息推送的技术原理及相关问题,希望能给你带来些许启发. 移动端实时消 ...
- 【iOS学习笔记】IOS开发中设置applicationIconBadgeNumber和消息推送
因为在IOS8中要想设置applicationIconBadgeNumber,需要用户的授权,在IOS8中,需要加上下面的代码: UIUserNotificationSettings *setting ...
- android开发 app消息提醒功能,Android中利用App实现消息推送机制的代码
1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今 ...
- springboot+websocket+sockjs进行消息推送【基于STOMP协议】
1.浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打 ...
最新文章
- 【AJAX】DWR入门教程
- 为了节省能量,人类演化出了“不合规律”的大脑神经元 | Nature
- Codeforces 535C - Tavas and Karafs
- Nginx笔记系列(1)——Nignx的安装部署
- 飞桨PaddleOCR环境搭建
- Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
- php-fpm:No pool defined解决方法
- 制作oracle11g yum源,利用安装盘简单制作yum源
- 7 win 卸载node_如何从windows中完全删除node.js_windows彻底卸载node教程
- L3-028 森森旅游 (30 分)-PAT 团体程序设计天梯赛 GPLT
- arm linux 中文输入法,ARM 安装中文输入法
- leaflet中文文档
- H3C交换机常用配置命令大全
- linux显示mem进行排序,linux下top命令显示详解
- C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....
- AI期末考试基础知识点复习(AI入门)
- 30天,O2O速成攻略【7.18广州站】
- 2015阿里校园招聘测试开发面试经验(广州站)
- xv6源码阅读——中断与异常
- 实验指导书(翻译)Project 4: Transactions