400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

如何用单线程和定时任务分别实现WebSocket聊天室

这篇文章主要讲解了“如何用单线程和定时任务分别实现WebSocket聊天室”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用单线程和定时任务分别实现WebSocket聊天室”吧!

创新互联建站于2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元东光做网站,已为上家服务,为东光各地企业和个人服务,联系电话:028-86922220

1.需求场景

要实现这种实时性较强的功能,以前经常采用的方法:轮询Comet技术

总结:都是基于请求-应答模式,不算真正意义上的实时技术,每一次请求应答,都要消耗一定流量。

2.WebSocket原理

WebSocket协议基于TCP协议实现,工作流程是这 样的:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据, 其优点:

如何用单线程和定时任务分别实现WebSocket聊天室

3.打造Websocket聊天室

温馨提示:基于IAEA+SpringBoot+Gradle开发,得益于SpringBoot提供的自动配置,只需要通过简单注解@ServerEndpoint就能创建WebSocket服务端,再通过简单的回调函数就能完成WebSocket服务端的编写!
	//spring-boot-starter-websocket的依赖springboot的高级组件会自动引用基础的组件,
	// 像spring-boot-starter-websocket就引入了spring-boot-starter-web和spring-boot-starter
	compile group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version: '2.1.6.RELEASE'
       //thymeleaf
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '2.1.6.RELEASE'
package com.example.SmartHome.config;


import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/*
 *@Description:  自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
 *@ClassName: WebSocketConfig
 *@Author: zzq
 *@Date: 2019/7/7 11:01
 *@Version: 1.0
 */
@Configuration
@Component
@ConditionalOnWebApplication

public class WebSocketConfig {
    /**
     * 自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
提醒:ServerEndpointExporter 是由Spring官方提供的标准实现,用于扫描ServerEndpointConfig配置类和@ServerEndpoint注解实例。使用规则:1.如果使用默认的嵌入式容器 比如Tomcat 则必须手工在上下文提供ServerEndpointExporter。2. 如果使用外部容器部署war包,则不要提供提供ServerEndpointExporter,因为此时SpringBoot默认将扫描服务端的行为交给外部容器处理。
package com.example.SmartHome.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/*
 *@Description: TODO
 *@ClassName: ChatController
 *@Author: zzq
 *@Date: 2019/7/9 16:56
 *@Version: 1.0
 */
@Controller
public class ChatController {
    @RequestMapping("/websocket")
    public String init() {
        return "websocket.html";
    }
}

5.前端代码


  
    My WebSocket Test

 Welcome
 Send Close  
       var websocket = null;     //判断当前浏览器是否支持WebSocket     if('WebSocket' in window){         websocket = new WebSocket("ws:2559qs1996.qicp.vip:20422/websocket");     }     else{         alert('Not support websocket')     }     //连接发生错误的回调方法     websocket.onerror = function(){         setMessageInnerHTML("error");     };     //连接成功建立的回调方法     websocket.onopen = function(event){         setMessageInnerHTML("open");     }     //接收到消息的回调方法     websocket.onmessage = function(event){         setMessageInnerHTML(event.data);     }     //连接关闭的回调方法     websocket.onclose = function(){         setMessageInnerHTML("close");     }     //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。     window.onbeforeunload = function(){         websocket.close();     }     //将消息显示在网页上     function setMessageInnerHTML(innerHTML){         document.getElementById('message').innerHTML += innerHTML + '
';     }     //关闭连接     function closeWebSocket(){         websocket.close();     }     //发送消息     function send(){         var message = document.getElementById('text').value;         websocket.send(message);     }  

6.结果展示

如何用单线程和定时任务分别实现WebSocket聊天室

服务端:

如何用单线程和定时任务分别实现WebSocket聊天室

感谢各位的阅读,以上就是“如何用单线程和定时任务分别实现WebSocket聊天室”的内容了,经过本文的学习后,相信大家对如何用单线程和定时任务分别实现WebSocket聊天室这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


网页标题:如何用单线程和定时任务分别实现WebSocket聊天室
转载来源:http://www.bluegullmedia.com/article/pecgji.html

其他资讯

让你的专属顾问为你服务

1.5402s