Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例【服务端与客户端实现全双工通讯】
现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发
出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏
览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占
用很多的带宽。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。
一、什么是WebSocket API?
WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的
客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等
浏览器的支持。
WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以
Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域
的限制,而WebSocket允许跨域通信。
Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。
那么我就开始我在项目中对websocket的使用,首先使用的是J2EE7的架包。
架包加完之后,只需要再添加2个类就可以实现使用的功能了。
首先添加一个Java类,WebsocketController.java
- package com.lwl.activemq.controller.websocket;
- import java.util.Map;
- import java.util.concurrent.ConcurrentHashMap;
- import javax.websocket.*;
- import javax.websocket.server.PathParam;
- import javax.websocket.server.ServerEndpoint;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * 功能说明:websocket处理类, 使用J2EE7的标准
- * @author Administrator
- * @create 2016-8-11 下午4:08:35
- * @version 1.0
- */
- @ServerEndpoint("/websocket/{myWebsocket}")
- public class WebsocketController {
- private static final Logger logger = LoggerFactory.getLogger(WebsocketController.class);
- public static Map<String, Session> clients = new ConcurrentHashMap<String, Session>();
- /**
- * 打开连接时触发
- * @param myWebsocket
- * @param session
- */
- @OnOpen
- public void onOpen(@PathParam("myWebsocket") String myWebsocket, Session session){
- logger.info("Websocket Start Connecting:" + myWebsocket);
- System.out.println("进入:"+myWebsocket);
- clients.put(myWebsocket, session);
- }
- /**
- * 收到客户端消息时触发
- * @param myWebsocket
- * @param message
- * @return
- */
- @OnMessage
- public String onMessage(@PathParam("myWebsocket") String myWebsocket, String message) {
- return "Got your message ("+ message +").Thanks !";
- }
- /**
- * 异常时触发
- * @param myWebsocket
- * @param throwable
- */
- @OnError
- public void onError(@PathParam("myWebsocket") String myWebsocket, Throwable throwable) {
- logger.info("Websocket Connection Exception:" + myWebsocket);
- logger.info(throwable.getMessage(), throwable);
- clients.remove(myWebsocket);
- }
- /**
- * 关闭连接时触发
- * @param myWebsocket
- */
- @OnClose
- public void onClose(@PathParam("myWebsocket") String myWebsocket) {
- logger.info("Websocket Close Connection:" + myWebsocket);
- clients.remove(myWebsocket);
- }
- /**
- * 将数据传回客户端
- * 异步的方式
- * @param myWebsocket
- * @param message
- */
- public static void broadcast(String myWebsocket, String message) {
- if (clients.containsKey(myWebsocket)) {
- clients.get(myWebsocket).getAsyncRemote().sendText(message);
- } else {
- throw new NullPointerException("[" + myWebsocket +"]Connection does not exist");
- }
- }
- }
然后添加相应的接受页面index.html:
- <!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">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <script type="text/javascript" src="resources/jquery-1.8.3.min.js"></script>
- </head>
- <body>
- <script type="text/javascript">
- //测试controller是否可以进入
- // ajaxDo("/activemq-client/index",null);
- // function ajaxDo(url,data){
- // $.ajax({
- // url:url ,
- // type: "post",
- // dataType: "json",
- // data: data,
- // success:function(result){
- // if(result.success){
- // alert(result.data);
- // }else{
- // alert(result.msg);
- // }
- // }
- // });
- // }
- //--------------------------------- webSocket ----------------------------------------------
- initSocket("user");
- initSocket("news");
- initSocket("client");
- function initSocket(myWebsocket) {
- var webSocket = null;
- window.onbeforeunload = function () {
- //离开页面时的其他操作
- };
- if (!window.WebSocket) {
- console("您的浏览器不支持websocket!");
- return false;
- }
- var target = 'ws://' + window.location.host + "/activemq-client/websocket/"+myWebsocket;
- if ('WebSocket' in window) {
- webSocket = new WebSocket(target);
- } else if ('MozWebSocket' in window) {
- webSocket = new MozWebSocket(target);
- } else {
- alert('WebSocket is not supported by this browser.');
- return;
- }
- // 收到服务端消息
- webSocket.onmessage = function (msg) {
- alert(msg.data);
- // 关闭连接
- webSocket.onclose();
- console.log(msg);
- };
- // 异常
- webSocket.onerror = function (event) {
- console.log(event);
- };
- // 建立连接
- webSocket.onopen = function (event) {
- console.log(event);
- };
- // 断线
- webSocket.onclose = function () {
- console.log("websocket断开连接");
- };
- }
- </script>
- </body>
- </html>
好了,websocket已经实现了,现在最重要的是我们要在哪儿监听哪些变动,在推送给前端的问题了,这里我监听了MQ消息队
列中的某个Queen,如果获取到消息就推送给前端展示,稍后我会把MQ的消息队列也写给大家看,做个参考。(当然你也可以
监听属于你自己的对象,主要是调用 WebsocketController.broadcast("client", jsonStr);第一个参数和前端的参数一
致,第二个参数是你想推送给前端的内容)。
- <span style="font-size:14px;"><span style="font-family:宋体;">package com.lwl.activemq.listener;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.MessageListener;
- import javax.jms.TextMessage;
- import org.apache.log4j.Logger;
- import org.springframework.stereotype.Component;
- import com.alibaba.fastjson.JSON;
- import com.lwl.activemq.domain.Client;
- import com.lwl.activemq.controller.websocket.WebsocketController;
- @Component("clientPushListener")
- public class ClientPushListener implements MessageListener {
- protected static final Logger logger = Logger.getLogger(ClientPushListener.class);
- @Override
- public void onMessage(Message message) {
- logger.info("[ClientPushListener.onMessage]:begin onMessage.");
- TextMessage textMessage = (TextMessage) message;
- try {
- String jsonStr = textMessage.getText();
- logger.info("[ClientPushListener.onMessage]:receive message is,"+ jsonStr);
- if (jsonStr != null) {
- Client info = JSON.parseObject(jsonStr, Client.class);
- System.out.println("==============================接受到的客户信息 开始====================================");
- System.out.println(info.toString());
- System.out.println("==============================接受到的客户信息 结束====================================");
- WebsocketController.broadcast("client", jsonStr);
- }
- } catch (JMSException e) {
- logger.error("[ClientPushListener.onMessage]:receive message occured an exception",e);
- }
- logger.info("[ClientPushListener.onMessage]:end onMessage.");
- }
- }</span></span>
转自: http://blog.csdn.net/LOVELONG8808/article/details/52277029
Java Websocket实例【服务端与客户端实现全双工通讯】相关推荐
- 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)
WebSocket协议是基于TCP的一种新的网络协议.WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. ...
- android java websocket client_websocket服务端,android客户端示例
服务端库依赖详见章末 #####spring websocket服务端代码(会话过程) public class HandshakeInterceptor extends HttpSessionHan ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- springboot+websocket实现服务端、客户端
一.引言 小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章. 什么场景下会要使用到websocket的呢 ...
- android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子
学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...
- java BIO tcp服务端向客户端消息群发代码教程实战
前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...
- ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息
找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- java websocket 实现_JAVA (Tomcat服务器)使用WebSocket实现服务端与HTML前端通信
在一个项目中要使用WebSocket技术来实现服务器与浏览器实时通信交互,在网上也找了许多资料.为了防止以后忘记具体的使用过程,下面我把自己的使用过程和方法记录下来方便自己以后使用. 项目背景: 基于 ...
最新文章
- 常用图像格式(PNG,JPG)到SGI图像格式(RGB,BW)的转换
- 如何禁止用户连续点击一个按钮事件详细JS
- 关于CE端口线路整改的建议
- PMCAFF微课堂 | 《社交红利2.0:即时引爆》徐志斌教你玩转社交
- Linux中常见目录的作用
- varnish与squid的比较
- 讨论需求时组里都是怎么做的
- WebDriver API学习记录
- Spring4 快速入门
- intellij idea设置代码提示不区分大小写
- PHP生成阿里云oss水印里的文字
- OSChina 周四乱弹 ——程序员真正的爱情
- 什么样的音乐和呼噜声最配?
- vs2005无法附加进程
- VDA6.3认证辅导,VDA6.3认证以保证汽车零部件生产过程中的质量保证
- 用Eclipse读取excel中全部数据
- 贪心算法求解:王者荣耀购买点券最优策略
- 2018深信服java笔试题_深信服2018春招笔试题解
- jenkins构建android并发布到蒲公英平台
- 统计学中sp_统计学名词解释
热门文章
- 2022-2028年全球与中国闪光棉市场研究及前瞻分析报告
- IPython 更改默认字体大小
- 【软件工程】RUP与软件开发5大模型
- Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
- tvm模型部署c++ 分析
- MindSpore模型精度调优实践
- gst-crypto GStreamer插件
- MLPerf Inference 0.7应用
- Python逻辑运算符 and ,or not 的理解
- Windows 系统执行Shell 脚本的方法