建设机械网站哪家好,html5修改器下载,网站建设群,怀化seo优化一、前言WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。HTML5 定义的 WebSocket 协议#xff0c;能更好的节省服务器资源和带宽#xff0c;并且能够更实时地进行通讯。HTML5 定义的 WebSocket 协议#xff0c;能更好的节省服务器资源和带宽能更好的节省服务器资源和带宽并且能够更实时地进行通讯。HTML5 定义的 WebSocket 协议能更好的节省服务器资源和带宽并且能够更实时地进行通讯。浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求连接建立以后客户端和服务器端就可以通过 TCP 连接直接交换数据。二、快速搭建springboot-websocket项目的服务端1 导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId/dependency
2 创建配置类Configuration
public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
3 创建WebSocketServer服务类 用来接收数据websocket的常用注解只有这5个ServerEndpoint注意上下文路径websocket连接地址OnMessage只有第一次加载websocket的时候会调用生命周期只有一次OnClose只有关闭websocket链接的时候会调用生命周期只有一次OnMessage每次接收信息的时候都会调用调用比较频繁OnError发生错误的时候调调用/*** 类似RequestMapping的地址* ws://localhost:8080/ws/000001*/
ServerEndpoint(/ws/{uuid})
Component
public class WebSocketServer {private Session session; //客户端会话//存放每个客户端的连接会话public static ConcurrentHashMapString,WebSocketServer clients new ConcurrentHashMap();//开启连接//存入连接回话中OnOpenpublic void onOpen(Session session, PathParam( uuid) String uuid){System.out.println(当前的uuid为uuid);this.session session;clients.put(uuid,this);}//发送消息OnMessagepublic void OnMessage(String msg, PathParam( uuid) String uuid){System.out.println(当前的uuid为uuid);System.out.println(收到消息: msg);}//关闭连接OnClosepublic void onClose(PathParam( uuid) String uuid){System.out.println(当前的uuid为uuid);System.out.println(关闭socket连接uuid);clients.remove(uuid);}//发生异常的情况OnErrorpublic void onError(Throwable error) {error.printStackTrace();}}
4 启动项目三、一般都是前端为客户端后端为服务端这种方式前端客户端我不会需要的自己百度,哈哈哈四、搭建java-websocket客户端该案例只是告诉大家可以用java搭建客户端4.1 依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.java-websocket/groupIdartifactIdJava-WebSocket/artifactIdversion1.3.5/version/dependency
4.2 客户端代码Component
public class WebSocketConfig {Beanpublic WebSocketClient webSocketClient() {try {WebSocketClient webSocketClient new WebSocketClient(new URI(ws://localhost:8081/ws/000001),new Draft_6455()) {Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println(ws 连接成功);}Overridepublic void onMessage(String message) {System.out.println(ws 收到消息message);}Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println(ws 退出);}Overridepublic void onError(Exception ex) {System.out.println(连接错误ex.getMessage());}};webSocketClient.connect();return webSocketClient;} catch (Exception e) {e.printStackTrace();}return null;}}
4.3 发送消息的代码SpringBootApplication
RestController
public class SpringbootWebsocketClientApplication {Autowiredprivate WebSocketClient webSocketClient;public static void main(String[] args) {SpringApplication.run(SpringbootWebsocketClientApplication.class, args);}RequestMapping(/get)public String send(){webSocketClient.send(我是ws客户端你好);return 发送成功;}}
4.4 结果4.5 服务端收到消息当前的uuid为000001
收到消息: 我是ws客户端你好
五、websocket传递头信息,协议头token的前后端解决方案js websocket 传递tokenwebsocket协议在握手阶段借用了HTTP的协议但是在JavaScript websocketAPI中并没有修改请求头的方法。1.1 基于协议头websocket请求头中可以包含Sec-WebSocket-Protocol这个属性该属性是一个自定义的子协议。它从客户端发送到服务器并返回从服务器到客户端确认子协议。我们可以利用这个属性添加token。var tokenfasdfadfasdfavar ws new WebSocket(ws:// url /webSocketServer,[token]);
后台取出websocket协议头的参数2.1 取出tokentoken ((HttpServletRequest) servletRequest).getHeader(Sec-WebSocket-Protocol);2.2 注意大坑如果传递了token参数后端响应的时候也必须带上这个token响应否则前端接收不到数据可以采用servlet的过滤器来做Order(1)
Component
WebFilter(filterName WebsocketFilter, urlPatterns /home/*)
public class WebsocketFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response (HttpServletResponse) servletResponse;String token ((HttpServletRequest) servletRequest).getHeader(Sec-WebSocket-Protocol);response.setHeader(Sec-WebSocket-Protocol,token);filterChain.doFilter(servletRequest, servletResponse);}Overridepublic void destroy() {}
}
六、结尾websocket最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻相互推送信息。 浏览器和服务器只需要要做一个握手的动作在建立连接之后服务器可以主动传送数据给客户端客户端也可以随时向服务器发送数据。第一、WebSocket是HTML5中的协议支持持久连接而Http协议不支持持久连接。第二、首先Websocket是一个持久化的协议相对于HTTP这种非持久的协议来说HTTP的生命周期通过 Request 来界定也就是一个 Request 一个 Response 那么在 HTTP1.0 中这次HTTP请求就结束了。在HTTP1.1中进行了改进使得有一个keep-alive也就是说在一个HTTP连接中可以发送多个Request接收多个Response。但是请记住 Request Response 在HTTP中永远是这样也就是说一个request只能有一个response。而且这个response也是被动的不能主动发起。第三、传统的http请求其并发能力都是依赖同时发起多个TCP连接访问服务器实现的(因此并发数受限于浏览器允许的并发连接数)而websocket则允许我们在一条ws连接上同时并发多个请求即在A请求发出后A响应还未到达就可以继续发出B请求。由于TCP的慢启动特性新连接速度上来是需要时间的以及连接本身的握手损耗都使得websocket协议的这一特性有很大的效率提升。第四、http协议的头部太大且每个请求携带的几百上千字节的头部大部分是重复的很多时候可能响应都远没有请求中的header空间大。如此多无效的内容传递是因为无法利用上一条请求内容websocket则因为复用长连接而没有这一问题。第五、当需要实现客户端刷新消息时传统方案往往通过定时ajax请求实现实际上对多数用户多数时间下这些请求都是无意义了并且非常占用资源websocket资源占用就小很多