当前位置: 首页 > news >正文

潍坊昌乐县城乡建设局网站wordpress主题验证码

潍坊昌乐县城乡建设局网站,wordpress主题验证码,合肥网站建设价格,做网站要买多少服务器空间这篇文章主要来介绍一下在java项目中#xff0c;特别是java web项目中websocket的应用。 场景#xff1a;我做了一个商城系统#xff0c;跟大多数商城系统#xff0c;分为客户端和后台#xff0c;客户端供客户浏览#xff0c;下单#xff0c;购买#xff0c;后台主要管… 这篇文章主要来介绍一下在java项目中特别是java web项目中websocket的应用。 场景我做了一个商城系统跟大多数商城系统分为客户端和后台客户端供客户浏览下单购买后台主要管理商品处理订单发货等。我现在要实现的功能是当客户端有客户下单并且支付完成以后主动推送消息给后台让后台的人知道好去处理发货等事宜。 首先我们要知道websocket 是一个连接这个连接是客户端页面与服务端之间的连接所以我们要分两部分来完成这个连接服务端代码和客户端代码。 1.首先在pom.xml引入如下jar包。 !-- websocket --dependencygroupIdorg.java-websocket/groupIdartifactIdJava-WebSocket/artifactIdversion1.3.0/version/dependency2.然后我们要知道的是websocket是客户端和服务端之间建立了一个连接建立完连接以后会生成一个websocket对象我们可以用这个对象来执行发送接收等操作。 但是这只是一个存在于客户端与服务器之间的链接换句话说系统只能识别到这个websocket连接是对应于哪个页面浏览器 而这个页面在系统中是对应哪个用户数据库中的用户或者根本就没有对应任何用户即未登录只是一个游客我们是无法从这个websocket对象中获取的。 所以我们需要创建一个Map对象用于将websocket对象和实际的user对象进行关联这样为我们后续向特定的用户推送消息做铺垫。 为此我们创建一个WsPool即websocket连接池的类该类用于管理现实中的用户和websocket对象之间的关联。代码如下。 package com.xdx.websocket;import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set;import org.java_websocket.WebSocket;public class WsPool {private static final MapWebSocket, String wsUserMap new HashMapWebSocket, String();/*** 通过websocket连接获取其对应的用户* * param conn* return*/public static String getUserByWs(WebSocket conn) {return wsUserMap.get(conn);}/*** 根据userName获取WebSocket,这是一个list,此处取第一个* 因为有可能多个websocket对应一个userName但一般是只有一个因为在close方法中我们将失效的websocket连接去除了* * param user*/public static WebSocket getWsByUser(String userName) {SetWebSocket keySet wsUserMap.keySet();synchronized (keySet) {for (WebSocket conn : keySet) {String cuser wsUserMap.get(conn);if (cuser.equals(userName)) {return conn;}}}return null;}/*** 向连接池中添加连接* * param inbound*/public static void addUser(String userName, WebSocket conn) {wsUserMap.put(conn, userName); // 添加连接}/*** 获取所有连接池中的用户因为set是不允许重复的所以可以得到无重复的user数组* * return*/public static CollectionString getOnlineUser() {ListString setUsers new ArrayListString();CollectionString setUser wsUserMap.values();for (String u : setUser) {setUsers.add(u);}return setUsers;}/*** 移除连接池中的连接* * param inbound*/public static boolean removeUser(WebSocket conn) {if (wsUserMap.containsKey(conn)) {wsUserMap.remove(conn); // 移除连接return true;} else {return false;}}/*** 向特定的用户发送数据* * param user* param message*/public static void sendMessageToUser(WebSocket conn, String message) {if (null ! conn null ! wsUserMap.get(conn)) {conn.send(message);}}/*** 向所有的用户发送消息* * param message*/public static void sendMessageToAll(String message) {SetWebSocket keySet wsUserMap.keySet();synchronized (keySet) {for (WebSocket conn : keySet) {String user wsUserMap.get(conn);if (user ! null) {conn.send(message);}}}}}3.接下来我们编写websocket的主程序类 该类用于管理[websocket]的生命周期。该类继承自WebSocketServer 这是一个实现了runnable接口的类他的构造函数需要传入一个端口所以我们需要为websocket服务指定一个端口该类有四个要重载的方法[onOpen()]方法在连接创建成功以后调用onClose在连接关闭以后调用[onError方法]在连接发生错误的时候调用一般连接出错以后触发了onError也会紧接着触发onClose方法。 onMessage方法在收到客户端发来消息的时候触发。我们可以在这个方法中处理客户端所传递过来的消息。 package com.xdx.websocket;import java.net.InetSocketAddress;import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer;public class WsServer extends WebSocketServer {public WsServer(int port) {super(new InetSocketAddress(port));}public WsServer(InetSocketAddress address) {super(address);}Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {// ws连接的时候触发的代码onOpen中我们不做任何操作}Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {//断开连接时候触发代码userLeave(conn); System.out.println(reason);}Overridepublic void onMessage(WebSocket conn, String message) { System.out.println(message);if(null ! message message.startsWith(online)){String userNamemessage.replaceFirst(online, message);//用户名userJoin(conn,userName);//用户加入}else if(null ! message message.startsWith(offline)){userLeave(conn);}}Overridepublic void onError(WebSocket conn, Exception ex) {//错误时候触发的代码System.out.println(on error);ex.printStackTrace();}/*** 去除掉失效的websocket链接* param conn*/private void userLeave(WebSocket conn){WsPool.removeUser(conn);}/*** 将websocket加入用户池* param conn* param userName*/private void userJoin(WebSocket conn,String userName){WsPool.addUser(userName, conn);}}上述onMessage()方法中我们接收到客户端传过来的一个message消息而这个客户端对应的websocket连接也被当成一个参数一起传递过来我们通过message中携带的信息来判定这条信息对应是什么操作如果是以online开头则说明它是一条上线的是信息我们就把该websocket和其对应的userName存入ws连接池中如果是以offline开头则说明websocket断开了我们也没有必要维护这个websocket对应的map键值对把它去除掉就好了。 4.如何在服务端开启这个socket呢 我们上面有说到[WsServer](的父类WebSocketServer 实现了一个runnable方法由此可见我们需要在一个线程中运行这个WsServer事实上WebSocketServer 有个start()方法其源码如下。 public void start() {if( selectorthread ! null )throw new IllegalStateException( getClass().getName() can only be started once. );new Thread( this ).start();;}很显然它开了一个线程。所以我们可以用下面这样的方法来开启一个websocket线程。该方法只是针对普通的java项目 如果是web项目需要在项目启动的时候运行websocket线程后面第7点会讲 public static void main(String args[]){WebSocketImpl.DEBUG false;int port 8887; // 端口WsServer s new WsServer(port);s.start();}我们运行这个main方法就开启了websocket的服务端。 到目前为止我们还没有编写任何客户端的代码。我们如何测试已经开了websocket服务端呢网上有一个免费的测试工具。测试地址如下[http://www.blue-zero.com/WebSocket/] 点击进去写上我们的websocket服务地址。点击连接。如图所示。 如果连接成功他就会显示“连接已建立正在等待数据……” 我们再文本框中输入onlinexdx然后点回车试试。 这就是模拟客户端向服务端发送onlinexdx请求按前面的介绍它会触发服务端的onMessage方法我们看一下服务端控制台。除了我们希望看到的onlinexdx这个message,还有一些heart,果然触发了这个方法。 heart是这个免费页面发送过来的心跳检测包目的是让websocket一直处于连接状态。 5.好了接下来我们要来完成客户端部分的功能。 我想要实现的是后台用户登录以后进入到后台主页的时候执行websocket连接工作就类似于上一步在免费页面点击连接按钮然后向服务端发送[“onlineuserName”]这条消息用以触发服务端的[onMessage方法就可以将该[userName加入到连接池了。我们将这些代码封装[js])中。 var websocket ; var ajaxPageNum 1; var last_health; var health_timeout 10; var tDates [], tData []; var rightIndex; if ($(body).attr(userName) ! $(body).attr(ws) yes) {var userName $(body).attr(userName);if (window.WebSocket) {websocket new WebSocket(encodeURI(ws:// document.domain :8887));websocket.onopen function() {console.log(已连接);websocket.send(onlineuserName);heartbeat_timer setInterval(function() {keepalive(websocket)}, 60000);};websocket.onerror function() {console.log(连接发生错误);};websocket.onclose function() {console.log(已经断开连接);initWs();};// 消息接收websocket.onmessage function(message) {console.log(message)showNotice(新订单, 您有新的逸品订单请及时处理)};} else {alert(该浏览器不支持下单提醒。br/建议使用高版本的浏览器br/如 IE10、火狐 、谷歌 、搜狗等);}} var initWs function() {if (window.WebSocket) {websocket new WebSocket(encodeURI(ws:// document.domain :8887));websocket.onopen function() {console.log(已连接);websocket.send(onlineuserName);heartbeat_timer setInterval(function() {keepalive(websocket)}, 60000);};websocket.onerror function() {console.log(连接发生错误);};websocket.onclose function() {console.log(已经断开连接);initWs();};// 消息接收websocket.onmessage function(message) {console.log(message)showNotice(新订单, 您有新的逸品订单请及时处理)};} else {alert(该浏览器不支持下单提醒。br/建议使用高版本的浏览器br/如 IE10、火狐 、谷歌 、搜狗等);} } var vadioTimeOut; function showNotice(title, content) {if (!title !content) {title 新订单;content 您有新的订单,请及时处理;}var iconUrl http://www.wonyen.com/favicon.ico;$(#myaudio)[0].play();// 消息播放语音var playTime 1;var audio document.createElement(myaudio);clearTimeout(vadioTimeOut);audio.addEventListener(ended, function() {vadioTimeOut setTimeout(function() {playTime playTime 1;playTime 3 ? audio.play() : clearTimeout(vadioTimeOut);}, 500);})if (Notification.permission granted) {var notification new Notification(title, {body : content,icon : iconUrl});notification.onclick function() {notification.close();};}}// 心跳包 function keepalive(ws) {var time new Date();if (last_health ! -1 (time.getTime() - last_health health_timeout)) {// ws.close();} else {if (ws.bufferedAmount 0) {ws.send(~HC~);}} }页面的主要代码如下。首先是引入上述js.这个js必须放在页面最后因为它需要加载完页面以获取body的attr。 !-- websocket -- script src./static/js/OtherJs/ws.js typetext/javascript/script其次是在页面的body处加入[userName和ws属性。作为参数传递到js里面。还需要加入语音附件。 body userName${adminName} wsyes !-- 消息提示音 --audio idmyaudio src./static/new_order.wav/audio上述js代码清楚地展示了 在页面端的生命周期需要注意的是我们在onopen()方法中先是向服务端发送onlineuserName] 进行上线处理紧接着开始调用心跳包避免websocket] 长时间闲置而失效。 [onmessage]方法中我们处理收到服务端推送过来的消息然后以语音和弹出窗的形式提醒客户端。 当然我们在服务端可以通过封装[message这个参数把它变成一个json对象给这个[json](对象一个[msgType]属性这样就可以根据[msgType的不同来执行不同的前端代码比如[msgTypenewOrder]_表示有新的订单就行新订单到来的代码msgTypenewUser表示有新的用户注册就执行新用户注册的代码。 这边我没做区分因为我在服务端只发送用户购买订单的消息所以所有的消息我都执行showNotice这个方法。 6.最后一步我们来编写从服务端向客户端发送消息的方法。 一旦有订单到来我们就向所有的后台用户发送消息。我们可以模拟一下这个动作写一个[controller]方法调用[WsPoo的[sendMessageToAll]方法。 ResponseBodyRequestMapping(sendWs)public String sendWs(String message) {WsPool.sendMessageToAll(message);return message;}7.对了如果是web项目 我们还需要在项目启动的时候开启websocket服务端线程可以把启动的动作放在一个filter中然后在web.xml里面配置这个filter使它在项目启动时候运行。 package com.xdx.filter;import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;import org.java_websocket.WebSocketImpl;import com.xdx.websocket.WsServer;public class StartFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {}public void init(FilterConfig arg0) throws ServletException {this.startWebsocketInstantMsg();}/*** 启动即时聊天服务*/public void startWebsocketInstantMsg() {WebSocketImpl.DEBUG false;WsServer s;s new WsServer(8887);s.start();} }在web.xml配置。 !-- filter --filterfilter-namestartFilter/filter-namefilter-classcom.xdx.filter.StartFilter/filter-class/filter至此我们完成了所有的代码。 8.测试先运行起项目。然后登陆以后进入后台主页可以看到已经连接成功了。 然后我们从服务端向后台发送一条消息执行sendWs这个方法。在浏览器输入http://192.168.1.185:8080/warrior/sendWs?messagexxx 会播放语音并且弹出提示。证明成功了。 上述只是websocket的一个简单的应用在此基础上我们还可以做很多扩展的工作比如做聊天室股票实时价格显示等只要掌握了原理就好做了
http://www.zqtcl.cn/news/771224/

相关文章:

  • 哪些网站可以做微商品牌宣传网站怎么不花钱做排名 知乎
  • 上传了网站源码怎么做wordpress加百度广告代码出问题
  • 哪些网站做推广vi设计说明模板
  • 杭州市建设工程造价管理协会网站攀枝花建设工程质量监督站投诉网站
  • 做网站推广送什么深圳的网站建设公司流程
  • 中国网站开发的前景制作公司主页网站
  • 在线画流程图的网站购物网站的设计与实现论文
  • 淘宝客cms网站建设K12网站怎么建设
  • 专业门户网站开发浙江省湖州艺术与设计学校官网
  • 企业网站搭建价格搭建平台的另一种说法
  • 网站开发框架桂林人论坛风姿摄影
  • 吉林省建设安全信息网站网站服务器和空间有什么区别
  • 百度制作网站怎么去掉2345网址导航
  • 深圳网站建设有限公司 2019哪些建材网站可以做宣传
  • 西安阿里云网站建设一建报名资格条件
  • 聊城网站优化wordpress循环该分类子分类
  • 帮网站做关键词排名优化创造网站需要多少钱
  • 广西网站建设推荐wordpress 宣布停止
  • 专注网站制作青岛景观设计公司排名
  • 安庆做网站网站代理建设网站观澜
  • 网站开发需求收集 模板cms做门户网站
  • dw网站首页的导航怎么做有大佬给个网址吗
  • 一个网站怎么做聚合洛可可设计公司贾伟
  • 什么是优化型网站网页设计作业在线网站首页
  • 关于网站建设广告词英文案例网站
  • 有哪些可以做策划方案的网站国家域名
  • vk网站做婚介做seo排名好的网站
  • 广州企业网站建设公司苏州建网站提
  • html如何做购物网站天元建设集团有限公司法人代表
  • 教育培训机构排名seo是搜索引擎营销