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

网站建设服务费交印花税吗门户网站怎么建设

网站建设服务费交印花税吗,门户网站怎么建设,国内设计师个人网页,ui设计网站设计与网页制作视频教程根据公司需求在SpringBoot项目中集成站内信#xff0c;于是#xff0c;我做了一个SpringBoot2.x 整合websocket 消息推送#xff0c;给指定用户发送信息和群发信息即点点对方式和广播方式2种模式。 文章目录一、地址部署总览二、实战需求案例三、实战准备3.1. pom依赖3.2. a… 根据公司需求在SpringBoot项目中集成站内信于是我做了一个SpringBoot2.x 整合websocket 消息推送给指定用户发送信息和群发信息即点点对方式和广播方式2种模式。 文章目录一、地址部署总览二、实战需求案例三、实战准备3.1. pom依赖3.2. application.yml3.3. 配置类3.4. 实体类3.5. websocket 服务端3.6. 控制器3.7. SpringBoot入口类四、初始化页面总览4.1. 服务端4.2. 客户端A4.3. 客户端B4.4. 客户端C五、案例实战5.1. 客户端A连接服务端5.2. 客户端B连接服务端5.3. 客户端C连接服务端5.4. 服务端连接状态ABC六、单独发送信息6.1. 服务端给指定客户端A发送消息6.2. 验证客户端A消息是否收到七、群发信息7.1. 给在线客户端群发消息7.2. 客户端A 消息验证7.2. 客户端B 消息验证7.3. 客户端C 消息验证一、地址部署总览 服务端地址http://localhost:8086/admin客户端地址http://localhost:8086/index 二、实战需求案例 服务端实例1个客户端A实例1客户端B实例2客户端C实例3 三、实战准备 3.1. pom依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.gblfy/groupIdartifactIdspringboot-websocket/artifactIdversionv1.0.0/versionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.1.RELEASE/version/parentproperties!--编码同意设置--project.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncoding!--JDK版本--java.version1.8/java.version/propertiesdependencies!--SpringMVC启动器--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--热部署插件--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency!--websocket启动器--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId/dependency!--thymeleaf 模板引擎启动器--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependency/dependenciesbuildplugins!--maven 打包编译插件--plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build /project3.2. application.yml server:port: 80 spring:devtools:restart:exclude: static/**,public/**enabled: true3.3. 配置类 package com.gblfy.websocket.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** 开启websocket的支持** Author gblfy* Email gbly02gmail.com* Date 2019/11/20 PM 23:50*/ Configuration public class WebSocketConfig { Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } } 3.4. 实体类 package com.gblfy.websocket.entity;import javax.websocket.Session; import java.io.Serializable;/*** Author gblfy* Email gbly02gmail.com* Date 2019/11/20 PM 23:50*/ public class Client implements Serializable {private static final long serialVersionUID 8957107006902627635L;private String userName;private Session session;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;}public Session getSession() {return session;}public void setSession(Session session) {this.session session;}public Client(String userName, Session session) {this.userName userName;this.session session;}public Client() {} } 3.5. websocket 服务端 package com.gblfy.websocket.server;import com.gblfy.websocket.entity.Client; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.List; import java.util.concurrent.CopyOnWriteArraySet; import java.util.stream.Collectors;/**** Author gblfy* Email gbly02gmail.com* Date 2019/11/20 PM 23:50*/ ServerEndpoint(value /socketServer/{userName}) Component public class SocketServer {private static final Logger logger LoggerFactory.getLogger(SocketServer.class);/**** 用线程安全的CopyOnWriteArraySet来存放客户端连接的信息*/private static CopyOnWriteArraySetClient socketServers new CopyOnWriteArraySet();/**** websocket封装的session,信息推送就是通过它来信息推送*/private Session session;/**** 服务端的userName,因为用的是set每个客户端的username必须不一样否则会被覆盖。* 要想完成ui界面聊天的功能服务端也需要作为客户端来接收后台推送用户发送的信息*/private final static String SYS_USERNAME niezhiliang9595;/**** 用户连接时触发我们将其添加到* 保存客户端连接信息的socketServers中** param session* param userName*/OnOpenpublic void open(Session session,PathParam(valueuserName)String userName){this.session session;socketServers.add(new Client(userName,session));logger.info(客户端:【{}】连接成功,userName);}/**** 收到客户端发送信息时触发* 我们将其推送给客户端(niezhiliang9595)* 其实也就是服务端本身为了达到前端聊天效果才这么做的** param message*/OnMessagepublic void onMessage(String message){Client client socketServers.stream().filter( cli - cli.getSession() session).collect(Collectors.toList()).get(0);sendMessage(client.getUserName()--message,SYS_USERNAME);logger.info(客户端:【{}】发送信息:{},client.getUserName(),message);}/**** 连接关闭触发通过sessionId来移除* socketServers中客户端连接信息*/OnClosepublic void onClose(){socketServers.forEach(client -{if (client.getSession().getId().equals(session.getId())) {logger.info(客户端:【{}】断开连接,client.getUserName());socketServers.remove(client);}});}/**** 发生错误时触发* param error*/OnErrorpublic void onError(Throwable error) {socketServers.forEach(client -{if (client.getSession().getId().equals(session.getId())) {socketServers.remove(client);logger.error(客户端:【{}】发生异常,client.getUserName());error.printStackTrace();}});}/**** 信息发送的方法通过客户端的userName* 拿到其对应的session调用信息推送的方法* param message* param userName*/public synchronized static void sendMessage(String message,String userName) {socketServers.forEach(client -{if (userName.equals(client.getUserName())) {try {client.getSession().getBasicRemote().sendText(message);logger.info(服务端推送给客户端 :【{}】,client.getUserName(),message);} catch (IOException e) {e.printStackTrace();}}});}/**** 获取服务端当前客户端的连接数量* 因为服务端本身也作为客户端接受信息* 所以连接总数还要减去服务端* 本身的一个连接数** 这里运用三元运算符是因为客户端第一次在加载的时候* 客户端本身也没有进行连接-1 就会出现总数为-1的情况* 这里主要就是为了避免出现连接数为-1的情况** return*/public synchronized static int getOnlineNum(){return socketServers.stream().filter(client - !client.getUserName().equals(SYS_USERNAME)).collect(Collectors.toList()).size();}/**** 获取在线用户名前端界面需要用到* return*/public synchronized static ListString getOnlineUsers(){ListString onlineUsers socketServers.stream().filter(client - !client.getUserName().equals(SYS_USERNAME)).map(client - client.getUserName()).collect(Collectors.toList());return onlineUsers;}/**** 信息群发我们要排除服务端自己不接收到推送信息* 所以我们在发送的时候将服务端排除掉* param message*/public synchronized static void sendAll(String message) {//群发不能发送给服务端自己socketServers.stream().filter(cli - cli.getUserName() ! SYS_USERNAME).forEach(client - {try {client.getSession().getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}});logger.info(服务端推送给所有客户端 :【{}】,message);}/**** 多个人发送给指定的几个用户* param message* param persons*/public synchronized static void SendMany(String message,String [] persons) {for (String userName : persons) {sendMessage(message,userName);}} } 3.6. 控制器 package com.gblfy.websocket.controller;import com.gblfy.websocket.server.SocketServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;/*** websocket* 消息推送(个人和广播)** Author gblfy* Email gbly02gmail.com* Date 2019/11/20 PM 23:50*/ Controller public class WebSocketController {Autowiredprivate SocketServer socketServer;/**** 客户端页面* return*/RequestMapping(value /index)public String idnex() {return index;}/**** 服务端页面* param model* return*/RequestMapping(value /admin)public String admin(Model model) {int num socketServer.getOnlineNum();ListString list socketServer.getOnlineUsers();model.addAttribute(num,num);model.addAttribute(users,list);return admin;}/*** 个人信息推送* return*/RequestMapping(sendmsg)ResponseBodypublic String sendmsg(String msg, String username){//第一个参数 :msg 发送的信息内容//第二个参数为用户长连接传的用户人数String [] persons username.split(,);SocketServer.SendMany(msg,persons);return success;}/*** 推送给所有在线用户* return*/RequestMapping(sendAll)ResponseBodypublic String sendAll(String msg){SocketServer.sendAll(msg);return success;} }3.7. SpringBoot入口类 package com.gblfy.websocket;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;/*** SpringBoot 启动器入口*/ SpringBootApplication public class SpringBootWebSocketApplication {public static void main(String[] args) {SpringApplication.run(SpringBootWebSocketApplication.class,args);} } 四、初始化页面总览 4.1. 服务端 4.2. 客户端A 4.3. 客户端B 4.4. 客户端C 五、案例实战 5.1. 客户端A连接服务端 5.2. 客户端B连接服务端 5.3. 客户端C连接服务端 5.4. 服务端连接状态ABC 六、单独发送信息 6.1. 服务端给指定客户端A发送消息 6.2. 验证客户端A消息是否收到 七、群发信息 7.1. 给在线客户端群发消息 7.2. 客户端A 消息验证 7.2. 客户端B 消息验证 7.3. 客户端C 消息验证 从以上图中可以看出测试符合预期。 项目源码https://github.com/gb-heima/springboot-websocket zip包下载链接 https://github.com/gb-heima/springboot-websocket/archive/master.zip
http://www.sadfv.cn/news/52995/

相关文章:

  • 招聘网站做精准 置顶哈尔滨市土地局
  • 网站程序是什么?网站优化 无需定金
  • 成品网站1688网页公众号里的电影网站怎么做的
  • 义乌高端网站建设乐云seo可视化网站建设
  • 东莞高端网站建设费用成全视频免费观看
  • 是做网站好还是做游戏好制作网页游戏过程
  • asp.net企业网站设计wordpress只能通过本机登录
  • 茂港网站建设公司网络组建论文
  • 淄博外贸网站建设ppt模板免费下载 动态
  • 青之峰网站建设安卓开发用什么开发工具
  • 青海找人做网站多少钱asp一个空间建多个网站系统
  • 网站排名张家港加入网络营销公司
  • 大连甘井子区区号烟台seo推广优化
  • 访问不了服务器的网站快云服务器怎么做网站
  • 姑苏营销型网站建设电话技术支持 海安网站建设
  • 网站建设都有哪些做 爱 网站小视频
  • 企业网站建设费怎么核算wordpress 下一篇
  • 哪个网站在线做头像好设计官网页面多少钱
  • flash个人网站片头智慧医疗软件公司排名
  • 高新区免费网站建设商丘网格通
  • html5网站app开发扁平化设计风格的网站
  • 网站管理的含义网站建设评判标准
  • 企业网站设计的特点wordpress 未找到
  • 张家港高端网站建设公司江苏省住房城乡建设部网站
  • 专业网站建设公司兴田德润优惠吗wordpress版权怎
  • 什么叫网站名称济南做网站优化的公司
  • 专业建设网站的公司网页前端设计师培训学校
  • 手机网站打不开是什么原因造成的大庆做流产油城女子网站
  • 长城宽带做网站购买一个网站需要多少钱?
  • 网站链接做投票学校网站建设责任书