黎志偉
(云南師范大學 信息學院,云南 昆明650000)
目前,隨著軟件市場的不斷擴大,各式各樣的網站、小程序、APP 應運而生,為了滿足軟件快速實現并簡捷部署的需求,大量免費開源項目和新技術被運用來實現軟件的快捷開發與部署,這種方式不僅縮短了平均開發周期,而且降低了該部分功能出現錯誤的可能性。本文介紹的是在web 平臺下使用docker 引擎和web socket 通訊協議開發并部署一款聊天系統,即在項目中引入web socket 協議進行對應的接口實現,最后服務器安裝docker 引擎來完成系統部署。
Docker 容器是一個開源的應用容器引擎,讓開發者可以以統一的方式打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何安裝了docker 引擎的服務器上(包括流行的Linux 機器、windows 機器),也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone 的app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴于任何語言、框架包括系統。Web Socket 是一種在單個TCP 連接上進行全雙工通信的協議,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向數據傳輸。
聊天系統的設計主要運用了web socket 的On open 方法和On message 兩個方法,客戶端首先生成一個不重復的UUID 作為用戶名去與服務端建立連接。服務端收到連接并維護所有客戶端的連接,連接成功后客戶端加載所有與服務端建立了連接的用戶,之后客戶端之間再以服務端做中轉站其它客戶端實現通訊,最后將系統部署在docker 容器中。本系統事先會準備一些圖片,作為默認用戶頭像,用戶連接以[key,value]的存儲方式保存在服務端特定集合中,本次會話的已讀和未讀消息也會保存在客戶端特定集合中。由于本次系統的重點不在于客戶端界面,客戶端制作為了節省時間,系統運用了一些網絡上開放的前端組件,主要包括3 個界面,系統初始界面、用戶列表界面、聊天主體界面。系統的界面流程圖如圖所示。這里的一些組件已經定義好了基礎點擊事件,但系統還需對部分業務邏輯代碼進行擴展,比如點擊事件;同時增加了系統需要實現的某些功能,主要增加了未讀消息數量提示功能,未讀/已讀消息保存功能,未讀消息提示清空功能等。
4.1 通訊功能。若A 用戶要與B 用戶進行通訊,A 用戶首先需要點擊好友列表中的B 用戶進入到聊天界面,A 用戶在發送消息區域輸入要發送的內容后,通過回車事件調用本地的send 方法,同時將發送的內容添加到聊天信息展示區域的左側,之后進入到服務端的On message 方法,通過消息接收方B 的send text 方法將消息發送到接收方B,接收方B 的客戶端進行一系列判斷,若都通過,直接將收到的消息添加到聊天消息區域的右側。
4.2 臨時保存聊天記錄。為了不影響用戶的聊天體驗,本系統還要實現保存當前用戶和其它用戶的聊天信息;本文提出兩種方案,第一種就是在當前用戶的本地客戶端用特定集合來保存聊天信息;第二種是將所有消息以特定的格式在服務端做持久化處理,并設置過期時間;本文選取第一種簡單的方案來處理。還有一點需要注意由于聊天信息保存在客戶端,也未作持久化處理,在客戶端保存的聊天信息失效時間點是用戶關閉了瀏覽器,因為聊天信息是保存在本地特定的集合中,當用戶關閉瀏覽器之后,將會丟失這些信息。
4.3 加載臨時保存的聊天信息和未讀消息。有了臨時保存聊天信息方案,若A 用戶切換聊天對象后,能恢復與B 之前的聊天信息,同時還要檢查B 是否給A 發消息且A 未讀這些消息,若有,在恢復完與B 之前的聊天信息后,還需要加載未讀消息。具體步驟如下:通過A 的UUID 與B 的UUID 組合起來從已讀消息集合中取出聊天信息Messages。遍歷Messages,通過每一條消息中的標識位(not Mine 和空)來判斷添加在聊天的界面左側或者右側。通過B的UUID 去遍歷未讀消息集合,消息需滿足標志為未讀,這是為了避免重復加載。這里是直接將未讀消息添加到聊天界面的右側,同時該條消息會被添加到對應的已讀消息集合。
4.4 加載所有在線用戶。A 用戶運行系統,首先調用客戶端的On open 方法以隨機生成的UUID 碼作為用戶名與服務端建立連接;服務端接收到客戶端的連接,同時將用戶名和對應的session 保存在一個特定的[key,value]集合中;之后當前客戶端加載所有在線用戶并以列表的形式展示,同時通過調用服務端的On message 方法通知其它所有在線的用戶,A 上線了需要重新加載好友列表。
4.5 未讀消息提示。先逐一遍歷本地未讀消息的集合,每遍歷一條消息之后都會遍歷一遍A 用戶的在線好友列表,如果未讀消息的發送方與A 用戶的好友列表中某一個用戶名相等,則在A 用戶對應的好友列表上將未讀消息數量上加一。如圖所示。

未讀消息提示
4.6 未讀消息清空。若A 用戶打開與B 用戶的聊天界面,后臺會加載B 發送給A 且A 未讀的消息,加載完B 發過來的消息后,需要把B 對應的未讀消息數量設置為0。
首先,在linux 服務器上安裝docker,修改鏡像為阿里云私人鏡像地址,安裝完成后,直接拉取一個標準的tomcat 鏡像下來;安裝Docker-compose,它是docker 的服務編排工具,主要是用來構建多個服務。在docker-compose.yml 文件中寫好對tomcat 的配置,其中有一個比較重要的屬性就是數據卷屬性,要設置宿主機目錄和容器目錄,這里的容器目錄指的是tomcat 的webapps 目錄,可以簡單理解為如果在宿主機目錄下放了項目war 包,那么容器目錄下也會有,起一個共享數據的作用,知道了這個作用,那么直接將war 包放在服務器指定的目錄下即可。一切準備就緒,通過docker-compose啟動我們的服務。如果后期項目需要多個tomcat,那是不是在docker-compose 的配置文件中配置多個tomcat 即可呢,如果又需要mysql,同樣可以加進來。只需要一個命令即可啟動配置文件中所有定義好的服務,非常簡捷。當然它的好處還有很多,這里就不一一列舉了。
在整個實現過程中,編碼不是特別規范,比如在某些地方采取拼接字符串來實現一些需求,這樣的后果就是若后期出現大規模修改會出現bug,修改起來費時費力,因此在以后的開發中應該盡可能規劃好自己的開發流程,同提升編碼的健壯性。此外,本系統沒有采用設計模式,一切采用最基本的編碼方式,旨在于給那些學習即時通訊的同學提供一種參考,能夠快速入門。