# web socket是什么?

WebSocket协议是基于TCP的一种新的网络协议。

它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端

## 用途

实时Web应用的解决方案,实现Web的实时通信。

说的再直白点,html的消息推送

假如你有一个页面,数据不定期更改,通常的做法就是轮询,客户端不停地向服务器请求最新的数据。

当有了web socket,数据变动时 让服务器通知客户端,启不是很美妙?

## 请求示例

(1) 默认端口是80和443(ssl)。

(2) 协议标识符是ws和ws(ssl)。

(3) 请求报文示例

General
--------------------------------------------
Request URL:ws://localhost:8080/j2ee-websocket/websocket/1
Request Method:GET
Status Code:101 Switching Protocols
---------------------------------------------
Response Headers
---------------------------------------------
Connection:upgrade
Date:Tue, 05 Dec 2017 01:22:45 GMT
Sec-WebSocket-Accept:cRxT/XcOpnsleDb1KdydWXOw+us=
Sec-WebSocket-Extensions:permessage-deflate;client_max_window_bits=15
Server:Apache-Coyote/1.1
Upgrade:websocket

web socket request

# 代码实现

代码分为3个部分:javax.websocket api实现,使用观察者模式增强,google/jquery-websocket代码库。

完整代码地址,开箱即用。github:j2ee-websocket

## 服务端 java代码

jar -- 引入javax.websocket,或引入javaee-api。

这里只展示api接口特性。

/**
*Web Socket api implement
*参数以URL路径参数传递
*/
@ServerEndpoint(value = "/websocket/{principal}")
public class DefaultWebSocket { /** Web Socket连接建立成功的回调方法 */
@OnOpen
public void onOpen(@PathParam("principal") String principal, Session session) {
    //...
} /** 服务端收到客户端发来的消息 */
@OnMessage
public void onMessage(@PathParam("principal") String principal, String message, Session session) {
    //...
} @OnClose
public void onClose(@PathParam("principal") String principal, Session session) {
    //...
} @OnError
public void onError(@PathParam("principal") String principal, Session session, Throwable error) {
//...
} }

## 服务端推送消息至客户端 java代码

这里使用了 观察者模式,对websocket进行了增强,详见完整代码:github:j2ee-websocket

     /**服务端向客户端推送消息*/
public void notifyTest() {
String principal = "1";
String type = "radio";
JSONObject data = new JSONObject();
data.put("title", "test web socket");
data.put("content", "Have you recieve this msg?--this msg from server."); WebSocketSubject subject = WebSocketSubject.Holder.getSubject(principal);
subject.notify(type, data.toJSONString());
}

## 客户端 javascript代码

普通js代码

<script type="text/javascript">
var websocket = null;
var principal = '1';
var socketURL = 'ws://' + window.location.host
+ '/j2ee-websocket/websocket/' + principal;
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket(socketURL);
}
else{
alert('Not support websocket');
} //连接发生错误的回调方法
websocket.onerror = function(event){
alert("error");
}; //连接成功建立的回调方法
websocket.onopen = function(){
alert("open");
} //接收到消息的回调方法
websocket.onmessage = function(event){
alert('recive : ' + event.data);
} //连接关闭的回调方法
websocket.onclose = function(event){
alert("close");
} //发送消息
function send(message){
websocket.send(message);
}
</script>

web socket js

推荐:google/jquery-websocket代码 (http://code.google.com/p/jquery-websocket)

google/jquery-websocket增加了消息的类型,将消息拆分为{"type":"","message":""}。

这样更灵活,可以根据业务类型,定义type,如:通知,公告,广播,发文等...

<script type="text/javascript">
var principal = '1';
var socketURL = 'ws://' + window.location.host
+ '/j2ee-websocket/websocket/' + principal; websocket = $.websocket(socketURL, {
open : function() {
// when the socket opens
alert("open");
},
close : function() {
// when the socket closes
alert("close");
},
//收到服务端推送的消息处理
events : {
'radio' : function(event) {
console.info($.parseJSON(event.data));
},
'notice' : function(event) {
console.info($.parseJSON(event.data));
},
//... more custom type of message
}
}); //发送消息
function send() {
websocket.send('radio', " hello,this msg from client request");
}
</script>

# 客户端运行示例

--END--

java版Web Socket,实现消息推送的更多相关文章

  1. Java企业微信开发_05_消息推送之发送消息(主动)

    一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...

  2. Java企业微信开发_04_消息推送之发送消息(主动)

    源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...

  3. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  4. Java企业微信开发_05_消息推送之被动回复消息

    一.本节要点 1.消息的加解密 微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip      ,此包中封装好了AES加解密方法,直接调用方法即可. 其中,解 ...

  5. SignalR web实时同步 消息推送 广播

    源码:https://github.com/SignalR/SignalR demo:http://download.csdn.net/download/qq_21533697/9702791#com ...

  6. Java实现 微信小程序 + 消息推送

    实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open- ...

  7. java实现基于activeMQ的消息推送

    一. 准备工作 1. 点击此下载相关的第三方jar包,并在工程中引用 二. spring配置文件:application.xml <?xml version="1.0" en ...

  8. 消息推送学习一、原生Socket的使用

    消息推送也是客户端和服务器连接然后进行交互的一种形式,但是不同于HTTP的连接,这种连接需要长时间的进行,当有消息时可以及时推送到客户端.除此之外还有多个用户,可能需要针对其身份进行不同的推送等等要求 ...

  9. 【js学习】js连接RabbitMQ达到实时消息推送

    js连接RabbitMQ达到实时消息推送 最近在自己捯饬一个网站,有一个功能是需要后端处理完数据把数据发布到MQ中,前端再从MQ中接收数据.但是前端连接MQ又成了一个问题,在网上搜了下资料,点进去一篇 ...

随机推荐

  1. Taffy自动化测试框架简介

    Taffy Taffy是基于nosetests的自动化测试框架. Taffy主要用来测试后台服务(包括且不限于Http, Dubbo/hessian, Webservice, Socket等类型接口) ...

  2. 用Eclipse 创建一个 简单的 Maven JavaWeb 项目

    使用Maven 创建一个简单的 javaWeb 项目: 本篇属于 创建 JavaWeb 项目的第三篇: 建议阅读本篇之前 阅读 用 Eclipse 创建一个简单的web项目  ;本篇是这这篇文章的基础 ...

  3. hibernate的操作Blob和Clob类型数据(笔记)

  4. IOS 中的JS

     文章摘自: http://www.cocoachina.com/ios/20150127/11037.html  JSContext/JSValue JSContext 即JavaScript代码的 ...

  5. 版本控制之二:SVN的初步使用(转)

    转自http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortoise ...

  6. Ionic3 启动非常慢

    优化: ionic cordova build android --prod --release

  7. 一个基于EntityFramework Core的简单数据库访问层,适用于轻量级数据库业务

    这个访问层的代码实际上是园子里某个前辈的,本人只是觉得好使,记录了下来. 本访问层需要通过Nuget安装EntityFramework Core,不过个人认为EF 6同样可以使用. 搭配数据库,最好是 ...

  8. mac nexus搭建本地maven服务器

    1.在保证安装jdk 1.7+,去nexus官网下载nexus(http://www.sonatype.com/download-oss-sonatype) 最新版本 2.解压zip文件,配置nexu ...

  9. rpm命令常用选项

    安装rpm包 # rpm -ivh ***.rpm #其中i表示安装,v表示显示安装过程,h表示显示进度 升级rpm包 # rpm -Uvh ***.rpm 删除软件包 # rpm -e PACKAG ...

  10. .NEL IL实现对象深拷贝

    对于深拷贝,通常的方法是将对象进行序列化,然后再反序化成为另一个对象.例如在stackoverflow上有这样的解决办法:https://stackoverflow.com/questions/785 ...