java实现消息推送_java实现后台服务器消息推送
1.什么是WebSocket
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
2.实现原理
在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
3.优点
在以前的消息推送机制中,用的都是 Ajax 轮询(polling),在特定的时间间隔由浏览器自动发出请求,将服务器的消息主动的拉回来,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
4.WebSocket和Socket的区别
1.WebSocket:
websocket通讯的建立阶段是依赖于http协议的。最初的握手阶段是http协议,握手完成后就切换到websocket协议,并完全与http协议脱离了。建立通讯时,也是由客户端主动发起连接请求,服务端被动监听。通讯一旦建立连接后,通讯就是“全双工”模式了。也就是说服务端和客户端都能在任何时间自由得发送数据,非常适合服务端要主动推送实时数据的业务场景。交互模式不再是“请求-应答”模式,完全由开发者自行设计通讯协议。通信的数据是基于“帧(frame)”的,可以传输文本数据,也可以直接传输二进制数据,效率高。当然,开发者也就要考虑封包、拆包、编号等技术细节。
2.Socket:
服务端监听通讯,被动提供服务;客户端主动向服务端发起连接请求,建立起通讯。每一次交互都是:客户端主动发起请求(request),服务端被动应答(response)。服务端不能主动向客户端推送数据。通信的数据是基于文本格式的。二进制数据(比如图片等)要利用base64等手段转换为文本后才能传输。
5.WebSocket客户端:
var websocket = null;
var host = document.location.host;
var username = "${loginUsername}"; // 获得当前登录人员的userName
// alert(username)
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
alert("浏览器支持Websocket")
websocket = new WebSocket('ws://'+host+'/mm-dorado/webSocket/'+username);
} else {
alert('当前浏览器 Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function() {
alert("WebSocket连接发生错误")
setMessageInnerHTML("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocket.onopen = function() {
alert("WebSocket连接成功")
setMessageInnerHTML("WebSocket连接成功");
}
//接收到消息的回调方法
websocket.onmessage = function(event) {
alert("接收到消息的回调方法")
alert("这是后台推送的消息:"+event.data);
websocket.close();
alert("webSocket已关闭!")
}
//连接关闭的回调方法
websocket.onclose = function() {
setMessageInnerHTML("WebSocket连接关闭");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function() {
closeWebSocket();
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '
';
}
6.WebSocket服务端(java后台):
1.核心类:
package com.mes.util;
import
java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.google.gson.JsonObject;
import net.sf.json.JSONObject;
@ServerEndpoint("/webSocket/{username}")
public class WebSocket {
private static int onlineCount = 0;
private static Map clients = new ConcurrentHashMap();
private Session session;
private String username;
@OnOpen
public void onOpen(@PathParam("username") String username, Session session) throws IOException {
this.username = username;
this.session = session;
addOnlineCount();
clients.put(username, this);
System.out.println("已连接");
}
@OnClose
public void onClose() throws IOException {
clients.remove(username);
subOnlineCount();
}
@OnMessage
public void onMessage(String message) throws IOException {
JSONObject jsonTo = JSONObject.fromObject(message);
String mes = (String) jsonTo.get("message");
if (!jsonTo.get("To
java实现消息推送_java实现后台服务器消息推送相关推荐
- java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...
- java web 插件式开发_Java Web 后台开发效率提高:插件讲解
上一篇文章 关于提高效率 介绍的后台框架应用 现在介绍下其中插件的具体功能,本文以某个具体插件来详细说明,选取 插件 " 过滤 " 用于详细讲解具体功能,以及框架数据流的走向过滤插 ...
- java apns feedback_php从苹果apns的feedback服务器获取推送失败的token
注意事项: 1.建议和feedback服务器建立长连接,连接过于频繁有可能被当做攻击(简简单单的做一些测试时没有关系的); 2.获取的token是在上次你给你的应用发推送失败时加feedback服务的 ...
- 服务器推送系统安装,搭建PXE服务器,推送安装linux系统
搭建环境: 推送服务器: Ip:192.168.189.138 系统:CentOS 5.8 推送系统:RHEL 5.4 1:配置dhcpd服务. 如果没有安装dhcpd服务,请安装: 1 2 3 4 ...
- java linux命令远程执行_java执行远程服务器上的shell命令
所需jar包,commons-io-2.6.jar, ganymed-ssh2-262.jar import ch.ethz.ssh2.ChannelCondition; import ch.ethz ...
- java linux 读取文件内容_java访问Linux服务器读取文件
所需jar包:j2ssh-core-0.2.2.jar java代码: SshClient client=new SshClient(); try{ client.connect("此处是L ...
- java如何实现群聊_Java实现通过服务器实现客户端之间的简单群聊
描述: 使用了socket编程.主要是通过服务器监听端口,对于新访问的客户端建立一个socket长连接.每次客户端输入信息,先传到服务器,再由服务发给在线的客户端. 其功能模型如下: 运行截图: 1. ...
- 消息102 级别15 状态1 服务器,消息102,级别15,状态1''附近的语法不正确(Msg 102, Level 15, State 1 Incorrect syntax near '')...
消息102,级别15,状态1'>'附近的语法不正确(Msg 102, Level 15, State 1 Incorrect syntax near '>') 我有一个像这样的SQL Se ...
- dwr 后台服务器推送技术
刚才写了一篇<dwr传对象到前台>,现在继续下一个总结点,dwr又一个令人兴奋的技术后台服务器推送技术,需要的包我就不写了 web.xml配置 <servlet> < ...
- PHP小程序接口的模板消息,微信小程序PHP 发送模板消息通知
注意: 首先,模板消息接口需写在后台服务器上.[追加!目前微信小程序 模板消息只能本人触发并发给本人.] 2018.4.9修改 :1次提交表单可下发1条,多次提交下发条数独立,相互不影响: 1次支付 ...
最新文章
- 《人月神话》——外科手术队伍——笔记!
- IDEA打包成war部署web项目
- 芬兰开放“线上AI速成班”课程,全球网民均可免费观看
- P1160 队列安排
- [Windows编程] C++中 bool,BOOL ,VARIANT_BOOL 的区别
- Linux C动态链接库实现一个插件例子
- 判断鼠标不在控件上_基础设施:一套基本控件
- php 动态输出图片尺寸,高并发下 php 输出图像对性能开销大不大?
- CVPR 2017 ADNet:《 Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning》论文笔记
- MySQL 基础————常用数据类型
- HTML+CSS+JS实现 ❤️echarts企业地区大数据图表模板❤️
- HNUSTOJ-1675 Morse Code(DFS+字典序搜索)
- PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
- 美国数学家维纳智力早熟,11岁就上了大学,他曾在1935-1936年 应邀参加中国清华大学讲学,一次他参加某个重要会议,年轻的脸孔 引人注意,于是有人询问他的年龄,他回答说“我年龄的立方是个4位数
- Linux入门基础命令教程
- 【Windows Server】由于没有远程桌面授权服务器可以提供许可证
- Cpp多重继承会产生的问题
- Shiny-Server的安装和使用教程
- chrome打开链接隐私设置错误_Chrome 隐私设置错误
- SAS对决Ultra320(下):MAX3147RC小胜Ultrastar 15K147
热门文章
- Windows+Caffe+VS2013+python接口配置过程
- error: crosses initialization of ‘std::string xx变量‘
- UFS开发板代码分析
- Android 图片虚化
- Echarts formatter综合写法
- Base64的Woff2字体信息如何转成成文件
- ecshop 配置服务器文件夹,ECSHOP3.6安装教程【ECSHOP3.6安装教程步骤】ECSHOP3.6安装教程详细讲解-ECSHOP教程网...
- RabbitMq使用demo
- rabbitmq 存入mysql_将RabbitMQ使用者数据保存到数据库中
- win7关闭系统索引服务器,win7系统彻底关闭索引的恢复步骤