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实现后台服务器消息推送相关推荐

  1. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?

    我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...

  2. java web 插件式开发_Java Web 后台开发效率提高:插件讲解

    上一篇文章 关于提高效率 介绍的后台框架应用 现在介绍下其中插件的具体功能,本文以某个具体插件来详细说明,选取 插件 " 过滤 " 用于详细讲解具体功能,以及框架数据流的走向过滤插 ...

  3. java apns feedback_php从苹果apns的feedback服务器获取推送失败的token

    注意事项: 1.建议和feedback服务器建立长连接,连接过于频繁有可能被当做攻击(简简单单的做一些测试时没有关系的); 2.获取的token是在上次你给你的应用发推送失败时加feedback服务的 ...

  4. 服务器推送系统安装,搭建PXE服务器,推送安装linux系统

    搭建环境: 推送服务器: Ip:192.168.189.138 系统:CentOS 5.8 推送系统:RHEL 5.4 1:配置dhcpd服务. 如果没有安装dhcpd服务,请安装: 1 2 3 4 ...

  5. java linux命令远程执行_java执行远程服务器上的shell命令

    所需jar包,commons-io-2.6.jar, ganymed-ssh2-262.jar import ch.ethz.ssh2.ChannelCondition; import ch.ethz ...

  6. java linux 读取文件内容_java访问Linux服务器读取文件

    所需jar包:j2ssh-core-0.2.2.jar java代码: SshClient client=new SshClient(); try{ client.connect("此处是L ...

  7. java如何实现群聊_Java实现通过服务器实现客户端之间的简单群聊

    描述: 使用了socket编程.主要是通过服务器监听端口,对于新访问的客户端建立一个socket长连接.每次客户端输入信息,先传到服务器,再由服务发给在线的客户端. 其功能模型如下: 运行截图: 1. ...

  8. 消息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 ...

  9. dwr 后台服务器推送技术

    刚才写了一篇<dwr传对象到前台>,现在继续下一个总结点,dwr又一个令人兴奋的技术后台服务器推送技术,需要的包我就不写了 web.xml配置 <servlet>   < ...

  10. PHP小程序接口的模板消息,微信小程序PHP 发送模板消息通知

    注意: 首先,模板消息接口需写在后台服务器上.[追加!目前微信小程序  模板消息只能本人触发并发给本人.] 2018.4.9修改 :1次提交表单可下发1条,多次提交下发条数独立,相互不影响: 1次支付 ...

最新文章

  1. 《人月神话》——外科手术队伍——笔记!
  2. IDEA打包成war部署web项目
  3. 芬兰开放“线上AI速成班”课程,全球网民均可免费观看
  4. P1160 队列安排
  5. [Windows编程] C++中 bool,BOOL ,VARIANT_BOOL 的区别
  6. Linux C动态链接库实现一个插件例子
  7. 判断鼠标不在控件上_基础设施:一套基本控件
  8. php 动态输出图片尺寸,高并发下 php 输出图像对性能开销大不大?
  9. CVPR 2017 ADNet:《 Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning》论文笔记
  10. MySQL 基础————常用数据类型
  11. HTML+CSS+JS实现 ❤️echarts企业地区大数据图表模板❤️
  12. HNUSTOJ-1675 Morse Code(DFS+字典序搜索)
  13. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
  14. 美国数学家维纳智力早熟,11岁就上了大学,他曾在1935-1936年 应邀参加中国清华大学讲学,一次他参加某个重要会议,年轻的脸孔 引人注意,于是有人询问他的年龄,他回答说“我年龄的立方是个4位数
  15. Linux入门基础命令教程
  16. 【Windows Server】由于没有远程桌面授权服务器可以提供许可证
  17. Cpp多重继承会产生的问题
  18. Shiny-Server的安装和使用教程
  19. chrome打开链接隐私设置错误_Chrome 隐私设置错误
  20. SAS对决Ultra320(下):MAX3147RC小胜Ultrastar 15K147

热门文章

  1. Windows+Caffe+VS2013+python接口配置过程
  2. error: crosses initialization of ‘std::string xx变量‘
  3. UFS开发板代码分析
  4. Android 图片虚化
  5. Echarts formatter综合写法
  6. Base64的Woff2字体信息如何转成成文件
  7. ecshop 配置服务器文件夹,ECSHOP3.6安装教程【ECSHOP3.6安装教程步骤】ECSHOP3.6安装教程详细讲解-ECSHOP教程网...
  8. RabbitMq使用demo
  9. rabbitmq 存入mysql_将RabbitMQ使用者数据保存到数据库中
  10. win7关闭系统索引服务器,win7系统彻底关闭索引的恢复步骤