該專案是我對大學三年究竟學習到了什麼進行的一次檢驗。在此寫出部落格一是為了記錄專案開發過程所遇到的坑和難題,二是為了新手能夠在漫漫碎片化的知識裡面找到乙個能知道大致的方向的指導書((╯`□′)╯~ ╧╧當然也不敢說我的是正確的)。從開始我會更新的比較慢,因為我也是摸著路過河的。至於要用到的知識,我會在需要該技術時提及其相關的知識。部落格也是時常會修改的,我想把它看作我的筆記本,通過修改填補空缺知識,成為我的乙個經驗書。
稍微總結一下資料
早年qq是基於tcp/ip協議的通訊軟體。聊天通訊採用udp協議,通過伺服器中轉方式。大家都知道,udp 協議雖然是不可靠協議,它只管傳送,不管對方是否收到的,但它的傳輸很高效。
tcp/ip(transmission control protocol/internet protocol,傳輸控制協議/網際協議)是指能夠在多個不同網路間實現資訊傳輸的協議簇。tcp/ip協議不僅僅指的是tcp 和ip兩個協議,而是指乙個由ftp、smtp、tcp、udp、ip等協議構成的協議簇, 只是因為在tcp/ip協議中tcp協議和ip協議最具代表性,所以被稱為tcp/ip協議。
http是乙個簡單的請求-響應協議,它通常執行在tcp之上。它指定了客戶端可能傳送給伺服器什麼樣的訊息以及得到什麼樣的響應。請求和響應訊息的頭以ascii碼形式給出;而訊息內容則具有乙個類似mime的格式。這個簡單模型是早期web成功的有功之臣,因為它使得開發和部署是那麼的直截了當。
其中請求和相應對於web聊天系統來說就是最重要的乙個步驟了,到後面我會一一說明,為什麼請求和相應會是重要的步驟?
因為任何web應用都逃不開這個步驟,c/s客戶-伺服器結構是構建當前網路應用的(b/s瀏覽器-伺服器結構是特殊的c/s結構)基礎執行模式,客戶端通過請求從而從伺服器獲取到想要的資料。
說到這裡,也就知道,web即時聊天系統其實也跟其他的web應用在底層實現思路上並沒有什麼不同。
即核心思想:使用者a傳送訊息到伺服器,伺服器進行一系列處理後(訊息封裝、反封裝、過濾、儲存、**)將訊息**給使用者b(或群體)。
傳統的思想既是如此,當然還有新的思路,接著看下去吧。
現在2023年了,我們還是看看比較新的技術吧,大致實現的方案有一下四種,本篇【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]
從零開始學習web前端開發
之前半個月一直在學習深度學習,但是感覺自己的能力還沒到那個程度所以就想擱置一下,從程式設計師基礎的前端開發來學。廢話不多說直接開記 我所使用的前端開發軟體就是業內很流行的vscode,作為小白的我當然也是用的這個 具體的安裝教程,外掛程式教程網上都有詳細的介紹,在此處不多講 在vscode中輸入 就...
從零開始製作留言板01
資料庫知識點 1 字串型別 常用 char固定長度 char列的長度固定為建立表時宣告的長度。長度可以為0到255的任何值 eg 5 假如錄入ab則後面會用空格補上但只顯示ab不顯示空格 varchar可變長度 varchar列中的值為可變長字串。長度可以指定為0到65535之間的值 eg varc...
從零開始的canvas
最近工作都是增刪改查。正好you有時間學點新東西,er而不是單純的業務上的東西 所以就學學canvas吧 sho首選建立乙個canvas var c document.getelementbyid mycanvas var ctx c.getcontext 2d 然後進行定義 ctx.beginpa...