web即时聊天系统的实现
第【0】页
前言
该项目是我对大学三年究竟学习到了什么进行的一次检验。在此写出博客一是为了记录项目开发过程所遇到的坑和难题,二是为了新手能够在漫漫碎片化的知识里面找到一个能知道大致的方向的指导书((╯`□′)╯~ ╧╧当然也不敢说我的是正确的)。从开始我会更新的比较慢,因为我也是摸着路过河的。至于要用到的知识,我会在需要该技术时提及其相关的知识。博客也是时常会修改的,我想把它看作我的笔记本,通过修改填补空缺知识,成为我的一个经验书。
项目背景
即时聊天系统[Instant Messaging],能想到的非常有名的QQ、微信这类型的客户端应用。以前QQ还存在有网页版,从2019年1月1日起停止服务,微信倒还存在有网页版。于是乎,我想写一个类似的应用,基于web端的即时聊天系统,能够达到即时聊天,在线互动,离线留言的功能。我认为该系统的泛用性很高,可以搭载在任何需要聊天留言功能的项目上。毕竟社交软件在如今的使用率可谓是前所未有的高。
设计思路
稍微总结一下资料
早年QQ是基于TCP/IP协议的通讯软件。聊天通讯采用UDP协议,通过服务器中转方式。大家都知道,UDP 协议虽然是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。
这里所说的TCP/IP根据百度百科TCP/IP协议_百度百科里写对他的解释
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
而这是QQ这款桌面平台软件使用到的网络通讯协议,而我们web端的使用到的是HTTP(应用层里定义的一种协议,它们的关系可以自行百度)
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。
其中请求和相应对于web聊天系统来说就是最重要的一个步骤了,到后面我会一一说明,为什么请求和相应会是重要的步骤?
因为任何web应用都逃不开这个步骤,C/S客户-服务器结构是构建当前网络应用的(B/S浏览器-服务器结构是特殊的c/s结构)基础运行模式,客户端通过请求从而从服务器获取到想要的数据。
说到这里,也就知道,web即时聊天系统其实也跟其他的web应用在底层实现思路上并没有什么不同。
即核心思想:用户A发送消息到服务器,服务器进行一系列处理后(消息封装、反封装、过滤、保存、转发)将消息转发给用户B(或群体)。
即时通讯方案
现在9012年了,我们还是看看比较新的技术吧,大致实现的方案有一下四种,本篇【0-1】只简单介绍一下,具体介绍,请看以后的文章
- ajax轮询
- ajax长轮询
- web-socket长连接
- server-send-event(用这个方案的网上的资料很少)
ajax轮询与ajax长轮询都是基于HTTP的,两者本身存在着缺陷:轮询需要更快的处理速度;长轮询则更要求处理并发的能力;两者都是“被动型服务器”的体现:服务器不会主动推送信息,而是在客户端发送ajax请求后进行返回的响应。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,WebSocket 使得客户端和服务器之间的数据交换变得更加简单。webSocket允许服务端主动向客户端推送数据。与传统的http协议不同,该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。连接一旦建立,客户端和服务器端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别。
SSE是HTML5新增的功能,全称为Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询、短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。
这种“主动型”相较“被动型”的性能更加优越。
[2019-10-25]