資源下載地址:https://download.csdn.net/download/sheziqiong/85596120
資源下載地址:https://download.csdn.net/download/sheziqiong/85596120文章來源地址http://www.zghlxwxcb.cn/news/detail-592440.html
Uchat——基于 python 的安全即時(shí)通訊系統(tǒng)
目的
設(shè)計(jì)完成簡(jiǎn)易的安全即時(shí)通訊系統(tǒng),實(shí)現(xiàn)類似于 QQ 的聊天軟件;
需求分析
功能需求
-
聊天客戶端
- 注冊(cè):用戶與集中服務(wù)器通信完成注冊(cè),包括用戶名、密碼、郵箱、性別、年齡、數(shù)字證書等信息傳輸,其中數(shù)字證書包含公鑰、用戶名、郵箱等信息。私鑰單獨(dú)保存在客戶端一個(gè)文件夾下不進(jìn)行傳輸;能顯示用戶名、郵箱不符合格式規(guī)范或者重復(fù),空輸入等錯(cuò)誤信息。
- 認(rèn)證登錄:客戶端與集中服務(wù)器通信完成用戶名、口令認(rèn)證登錄;能顯示用戶名、密碼錯(cuò)誤導(dǎo)致的登錄錯(cuò)誤信息。還有已登錄賬號(hào)再次登錄時(shí)的多重登錄檢驗(yàn),并將之前登陸的賬號(hào)頂下去。
- 好友管理:用戶可通過服務(wù)器進(jìn)行搜索、添加、刪除好友。
- 即時(shí)通信:用戶通過客戶端實(shí)現(xiàn)與好友的聊天,包括文字、圖片傳輸。文字可實(shí)現(xiàn)字體顏色和大小的改變。
- 聊天記錄:客戶端能夠保存聊天記錄并且可以查看聊天記錄。
- 消息加解密:采用 D-H 體制協(xié)商加密秘鑰,用對(duì)稱密碼 AES 算法進(jìn)行加解密。
- 消息摘要:使用 MD5 算法實(shí)現(xiàn)消息摘要認(rèn)證功能,確保發(fā)送消息的完整性。
- 用戶未讀消息提醒:紅點(diǎn)標(biāo)注未讀消息數(shù)目,并按最后發(fā)送消息時(shí)間排列好友列表。
- 用戶離線后消息處理:用戶上線后及時(shí)接收到離線時(shí)好友發(fā)送的消息。
功能結(jié)構(gòu)圖
-
集中服務(wù)器
- 用戶注冊(cè):與用戶通信完成注冊(cè),對(duì)用戶名和郵箱格式、是否重復(fù),輸入不規(guī)范等做必要的檢驗(yàn),接收客戶端的數(shù)字證書,發(fā)送服務(wù)端數(shù)字證書。
- 登錄驗(yàn)證:用戶登錄時(shí),驗(yàn)證用戶名和密碼是否正確,并向客戶端返回登錄結(jié)果。如信息正確,就將在線好友用戶發(fā)給該用戶,將該用戶的狀態(tài)發(fā)給各在線好友用戶,同時(shí)在服務(wù)器端顯示出來。
- 用戶公鑰,證書提供:用戶向好友發(fā)送消息時(shí),與服務(wù)器建立安全連接獲取好友的證書信息,服務(wù)器控制 client.socket 像好友用戶發(fā)送信息,實(shí)現(xiàn)用戶之間的通信。
- 用戶在線狀態(tài)維護(hù):當(dāng)用戶在線時(shí),記錄保存用戶的在線狀態(tài)、IP 地址、端口號(hào)。
- 用戶消息列表實(shí)時(shí)發(fā)放:由監(jiān)聽函數(shù)將操作實(shí)時(shí)加入到執(zhí)行函數(shù)列表中遞歸執(zhí)行。向用戶發(fā)送其好友列表的在線離線情況,包括好友用戶名、IP 地址、端口號(hào)。并按照最后發(fā)消息的時(shí)間對(duì)好友消息列表進(jìn)行排序。
功能結(jié)構(gòu)圖
-
高級(jí)功能
- 離線用戶消息通知:暫時(shí)存儲(chǔ)離線用戶的消息,用戶上線后,顯示未讀的消息并用紅點(diǎn)標(biāo)注;
- 好友在線離線功能實(shí)時(shí)更新;
- 限制賬號(hào)只能一處登錄:一個(gè)賬號(hào)只能在一處登錄,在別處登錄時(shí)會(huì)把原先的登錄踢下線;
- 支持群聊功能:可以創(chuàng)建群聊,并根據(jù)群號(hào)加入群聊;
- 聊天時(shí)字體大小顏色可更改;
- 支持聊天各類圖像文件的緩存。
數(shù)據(jù)需求
-
客戶端
客戶端登錄后加過的好友和加入的群聊需要從數(shù)據(jù)庫中調(diào)出信息并在前端反饋呈現(xiàn)出來。客戶端的聊天記錄可以存儲(chǔ)在數(shù)據(jù)庫中,用到時(shí)直接讀取返回消息歷史。
-
集中服務(wù)器
-
users 表:用戶信息表,存儲(chǔ)用戶基本信息,包括用戶 ID(id)、用戶名(username)、密碼(password)、電子郵箱(email)、用戶登錄 IP 地址(ip)、用戶登錄端口(port)、性別(sex)、年齡(age)、公鑰(pk)。
名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注 id INTEGER Y Y N 用戶 id username TEXT N Y N 用戶名 password TEXT N Y N 密碼 email TEXT N Y N 郵箱 ip TEXT N Y N 登錄 IP port TEXT N Y N 登錄端口 sex TEXT N Y N 性別 age TEXT N Y N 姓名 pk TEXT N Y N 公鑰 -
friends 表:存儲(chǔ)用戶的好友信息,包括用戶 id(from_user_id)、好友 id(to_user_id)、加好友請(qǐng)求是否接受(accepted)。
名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注 from_user_id INTEGER Y Y N 本人 ID to_user_id INTEGER Y Y N 好友 ID accept BOOLEAN N N N 接受狀態(tài) -
chat_history 表:存儲(chǔ)好友的聊天記錄,包括發(fā)送方 ID(user_id)、接收方(target_id)ID(target_type)、聊天數(shù)據(jù)(data)(BLOB 類型存儲(chǔ)二進(jìn)制大對(duì)象,可以實(shí)現(xiàn)文件數(shù)據(jù)的直接存儲(chǔ)),sent(用于標(biāo)識(shí)消息是否已發(fā)送,若未發(fā)送,先存儲(chǔ)這個(gè)操作,在某一次事件再次觸發(fā)時(shí)檢查標(biāo)志位,操作服務(wù)端再次控制 client.socket 發(fā)送消息)。
名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注 id INTEGER Y Y N 消息 ID user_id INTEGER N N N 用戶 ID target_id INTEGER N N N 消息目標(biāo) ID target_type TEXT N N N 目標(biāo)類型:群/用戶 data BLOB N N N 消息體 sent BOOLEAN N N N 發(fā)送是否成功 -
rooms 表:群組表,包括該群組的主鍵 ID(id)、群組的名稱(room_name)。
名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注 id INTEGER Y Y N 群聊 ID room_name TEXT N Y N 群聊名 -
room_user 表:群組用戶表,包括群組的 ID,群聊房間號(hào)(room_id)、加入該群組的用戶(user_id)。
名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注 id INTEGER Y Y N ID room_id INTEGER N N N 群聊 ID user_id INTEGER N N N 用戶 ID
-
性能需求
-
可靠性需求
保證一個(gè)用戶只能同時(shí)使用一個(gè) IP 地址登錄,客戶端不會(huì)出現(xiàn)閃退、加密無效的情況。
-
安全性需求
客戶端做好完整的封裝;傳輸信息采用經(jīng)過公鑰加密機(jī)制協(xié)商的 AES 對(duì)稱加密秘鑰;服務(wù)器及時(shí)更新客戶端 IP 地址等信息。
-
可維護(hù)性與可擴(kuò)展性需求
對(duì)于軟件功能方面,采用高內(nèi)聚低耦合的模塊化設(shè)計(jì),包括登錄模塊、注冊(cè)模塊、好友列表模塊、聊天模塊等,確保每個(gè)模塊的具有較高的獨(dú)立性,使軟件源碼便于維護(hù),同時(shí)便于后期添加聊天群等更多擴(kuò)展內(nèi)容,保證軟件可以進(jìn)行更新?lián)Q代。
-
運(yùn)行環(huán)境需求
-
客戶端:python3
-
服務(wù)端:
python3
PC 硬盤容量:50G
運(yùn)行內(nèi)存:2G
-
UI 需求
- 頁面內(nèi)容:聊天字體大小和顏色可更改,主題突出,語言簡(jiǎn)單明了易懂,菜單設(shè)置合理、頁面布局規(guī)范,文字準(zhǔn)確,語言流暢。
- 技術(shù)環(huán)境:頁面大小合適,無錯(cuò)誤鏈接和空鏈接。
- 藝術(shù)風(fēng)格:界面版面形象清晰,布局合理,字號(hào)大小適宜,字體選擇合理,前后一致,動(dòng)靜搭配恰當(dāng),色彩和諧自然,與主題內(nèi)容協(xié)調(diào)。
操作需求
- 所有彈出的窗口不超過一層,無層層堆疊的現(xiàn)象,不能無故為操作增加復(fù)雜度。
- 用戶注冊(cè)、用戶登錄、添加好友、刪除好友聊天窗口的開啟等所有操作務(wù)必要簡(jiǎn)單、快捷,限制在兩次點(diǎn)擊以內(nèi)。
- 考慮到操作人員工作的實(shí)際環(huán)境狀況,就要保證設(shè)計(jì)的按鍵足夠的清晰足夠大。
詳細(xì)設(shè)計(jì)
系統(tǒng)結(jié)構(gòu)說明
本系統(tǒng)的核心控制邏輯在于 C-S-C 之間發(fā)送的數(shù)據(jù)中包含了操作碼,接收方通過對(duì)接收碼的識(shí)別作出規(guī)定的操作。例如服務(wù)端接收添加好友的操作碼會(huì)執(zhí)行 add_friend.py。客戶端接收操作碼并不斷把對(duì)應(yīng)函數(shù)放入遞歸函數(shù)的隊(duì)列中,由遞歸函數(shù)逐一執(zhí)行隊(duì)列中的函數(shù)。
系統(tǒng)主要分為三個(gè)部分:
- 聊天客戶端(client)
- 集中服務(wù)器(server)
- 相互通信時(shí)的共同部分(common)
Uchat
│ config.json
│ run_client.py
│ run_server.py
│
├─client
││ __init__.py
││
│├─components
││ contact_item.py//聯(lián)系人列表UI
││ vertical_scrolled_frame.py//Tkinter可滾動(dòng)框架
││ __init__.py
││
│├─forms
│││ chat_form.py//聊天界面及處理與聊天相關(guān)的事件
│││ contacts_form.py//聯(lián)系人列表
│││ login_form.py//登錄界面
│││ register_form.py//注冊(cè)界面
│││ __init__.py
│││
││└───images//背景圖片
││ contacts_bg.gif
││ contacts_bg.png
││ login_bg.gif
││ register_bg.gif
││ VerticalScrolled.png
││
│├─memory
││ __init__.py//緩存數(shù)據(jù)
││
│└─util
│ │ __init__.py
│ └─ socket_listener
│ __init__.py//監(jiān)聽socket的線程
│
├─common
││ config.py//獲取配置信息
││ global_vars.py//全局變量
││ __init__.py
││
│├─cryptography
││ crypt.py//密鑰協(xié)商相關(guān)函數(shù)
││ prime.py//隨機(jī)生成一個(gè)大素?cái)?shù)
││ __init__.py
││
│├─message
││ __init__.py//消息處理(消息類型定義,序列化過程等)
││
│├─transmission
││ secure_channel.py//安全信道的建立和傳輸
││ __init__.py
││
│└─util
│ │ __init__.py
│ │
│ └─ socket_listener
│ __init__.py//客戶端socket監(jiān)聽
│
└─server
│ database.db
│ main.sql
│ __init__.py
│
├─broadcast
│ __init__.py//廣播消息
│
├─event_handler
│ add_friend.py//加好友
│ bad.py//出現(xiàn)錯(cuò)誤操作使程序走向可處理除0操作
│ client_echo.py//測(cè)試CS通信
│ create_room.py//創(chuàng)建群聊
│ del_friend.py//刪除好友
│ join_room.py//加入群聊
│ login.py//登錄
│ query_room_users.py//執(zhí)行群聊中發(fā)消息的操作
│ register.py//注冊(cè)
│ resolve_friend_request.py//處理加好友請(qǐng)求
│ send_message.py//發(fā)消息
│ __init__.py
│
├─memory
│ __init__.py//緩存數(shù)據(jù)
│
└─util
│__init__.py//添加對(duì)象類型
│
└─database
__init__.py//數(shù)據(jù)庫操作
-
聊天客戶端 client
實(shí)現(xiàn)安全即時(shí)通信系統(tǒng)的客戶端,主要功能是通過界面與用戶實(shí)現(xiàn)交互;通過 socket 與集中服務(wù)器進(jìn)行通信,獲得集中服務(wù)器的服務(wù),實(shí)現(xiàn)用戶的注冊(cè)登錄等功能。與好友即時(shí)通信和加入群聊通信。
- 登錄模塊 LoginForm
該模塊創(chuàng)建登錄界面并可鏈接到注冊(cè)界面,若輸入為空則報(bào)錯(cuò),否則將獲取用戶輸入的用戶名和密碼打包成登錄請(qǐng)求消息(MessageType.login)發(fā)送給服務(wù)器,服務(wù)器根據(jù)消息類型和數(shù)據(jù)包中的內(nèi)容以及在數(shù)據(jù)庫查找到的結(jié)果進(jìn)行判斷,根據(jù)不同情況發(fā)送不同的反饋給客戶端??蛻舳耸盏椒答佅?,若 data[‘type’]為 login_failed,則用戶名和密碼輸入有誤;若為 data[‘type’]為 login_successful 則根據(jù) memory 進(jìn)入登錄后顯示好友列表的 ContractsForm 界面。 - 注冊(cè)模塊 RegisterForm
該模塊只有在登錄界面點(diǎn)擊注冊(cè)按鈕時(shí)才會(huì)顯示。通過注冊(cè)窗口獲得用戶輸出的個(gè)人信息:用戶名、密碼、郵箱、性別、年齡,若其中用戶名、郵箱、密碼為空或兩次密碼輸入不一致則會(huì)提示相應(yīng)的錯(cuò)誤以引導(dǎo)用戶進(jìn)行正確的輸入,否則將獲取用戶輸入打包成注冊(cè)請(qǐng)求消息(MessageType.register)發(fā)送給服務(wù)器。服務(wù)器查找數(shù)據(jù)庫判斷是否用戶名已經(jīng)注冊(cè)過,發(fā)送不同反饋給用戶,若 data[‘type’]為 username_taken,則用戶名已被注冊(cè),若 data[‘type’]為 MessageType.register_successful 則注冊(cè)成功,并且在客戶端生成證書包含用戶的用戶名,郵箱,公鑰。 - 主界面 ContactsForm
該模塊在用戶登錄成功以后顯示。顯示好友列表中好友的用戶名、在線狀態(tài),ip 地址及端口號(hào)等。下方的按鈕有添加好友、刪除好友、添加群聊、創(chuàng)建群聊。可以點(diǎn)擊相應(yīng)的按鈕進(jìn)行相應(yīng)的操作,發(fā)給服務(wù)器相應(yīng)的數(shù)據(jù)包,服務(wù)器接收到數(shù)據(jù)包后進(jìn)行解析,根據(jù)不同類型進(jìn)行 event_handler。若點(diǎn)擊好友列表或群聊即可跳出聊天界面進(jìn)行聊天。未讀的消息會(huì)用紅點(diǎn)標(biāo)注,根據(jù)最后一條消息的發(fā)送時(shí)間來對(duì)好友列表排序。 - .聊天界面 ChatForm
該模塊是用戶與好友聊天的界面。當(dāng)用戶在好友列表中點(diǎn)擊好友列表時(shí),即向好友發(fā)出聊天,服務(wù)器收到聊天請(qǐng)求后尋找對(duì)方的證書,找到對(duì)方的公鑰,雙方使用 Diffie-Hellman 算法協(xié)商算法,然后利用 AES 加密消息保證消息的機(jī)密性,MD5 生成消息摘要驗(yàn)證保證消息的完整性。另外還可以更改聊天過程中字體的大小和顏色,支持多行輸入,支持發(fā)送文件,以圖片為例,將保存聊天過程中的接收到的圖片,并識(shí)別其格式。 - 客戶端部件(components)模塊
該模塊實(shí)現(xiàn) tkinter 靜態(tài)部件添加和滾動(dòng)模塊的實(shí)現(xiàn)。 - 客戶端 memory 管理模塊(memory)
該模塊用于初始化 tkinter 對(duì)象 tk 的屬性,如窗口,secure_channel 對(duì)象等。 - 多用(util)中的 socket_listener 模塊
該模塊用于客戶端處理消息類型,文本或其他。以及不斷循環(huán)建立連接 socket 接收消息,實(shí)現(xiàn)數(shù)據(jù)包的完整接收。定義處理給好友框,消息框更新歷史消息的函數(shù),事件操作的監(jiān)聽函數(shù)和移除函數(shù),消息的監(jiān)聽函數(shù)和移除函數(shù)??梢詫?shí)現(xiàn)接收數(shù)據(jù)并且拼成塊,更新聊天的歷史記錄,通知客戶端更新 contacts 界面上的最后一條消息的內(nèi)容,時(shí)間,未讀消息的數(shù)目等。
- 登錄模塊 LoginForm
-
集中服務(wù)器 server
- event_handler 模塊
該模塊分為 11 個(gè)部分,分別具體處理客戶端發(fā)來的各個(gè)操作事件。如登錄加好友刪除好友等操作。 - database 數(shù)據(jù)庫模塊
該模塊主要是根據(jù)客戶端觸發(fā)的事件對(duì)數(shù)據(jù)庫的各種操作。 - broadcast 廣播模塊
該模塊主要是針對(duì)群聊,為群組中的每個(gè)在線用戶廣播發(fā)送消息。 - memory 模塊
定義用戶與 secure_channel 對(duì)象互相映射的字典列表,所有已經(jīng)建立的 secure_channel 對(duì)象,以及用戶下線后將其從在線 secure_channel 對(duì)象列表中移除的操作。
- event_handler 模塊
-
客戶端服務(wù)器公用模塊 common
- message 模塊
將變量數(shù)據(jù)等變成可存儲(chǔ)或者傳輸?shù)倪^程即序列化,同時(shí)還將各個(gè)事件的類型變?yōu)槊杜e變量保存,將收到的數(shù)據(jù)包反序列化進(jìn)行恢復(fù),再提取數(shù)據(jù)包中 Message 的類型。 - cryptography 模塊
用于調(diào)用其生成公鑰,然后從證書中獲取公鑰,再使用 D-H 算法協(xié)商生成共享密鑰。 - prime 模塊
該模塊主要是判斷是否為素?cái)?shù),生成大素?cái)?shù),為證書的生成提供基礎(chǔ)。 - secure_channel 模塊
該模塊主要是定義 secure_channel 類,即包裹了 socket 和參數(shù)秘鑰的封裝對(duì)象。在通信對(duì)象之間協(xié)商好對(duì)稱加密秘鑰之后封裝在這個(gè)新的對(duì)象中。并且這個(gè)對(duì)象對(duì)數(shù)據(jù)有新的函數(shù)功能:- send 函數(shù)
用于對(duì)發(fā)送的序列化之后的數(shù)據(jù)用對(duì)稱加密秘鑰進(jìn)行 AES 加密并用 struct 結(jié)構(gòu)體將其打包成自設(shè)協(xié)議格式的數(shù)據(jù)包。 - on_data
函數(shù)主要用于接受數(shù)據(jù)的逆向解析。按照要求配置 socket 和數(shù)據(jù)傳輸?shù)母袷竭M(jìn)行規(guī)則化。數(shù)據(jù)包的格式為前四個(gè)字節(jié)為消息體的長(zhǎng)度,接著一字節(jié)存儲(chǔ) AES 加密時(shí)的消息填充長(zhǎng)度,然后 16 字節(jié) AES 加密時(shí)所需要的初始值,再接著是 32 字節(jié)的消息摘要,最后才是加密后的消息體。
- send 函數(shù)
- message 模塊
重要數(shù)據(jù)說明
-
發(fā)送接收的數(shù)據(jù)格式
-
接收數(shù)據(jù)時(shí)的三個(gè)字典
- bytes_to_receive={}——用于存儲(chǔ)對(duì)應(yīng)用戶 id 或者服務(wù)器的將要接收的數(shù)據(jù);
- bytes_received={}——用于標(biāo)識(shí)已經(jīng)接收的數(shù)據(jù);
- data_buffer={}——用于將已經(jīng)接收的數(shù)據(jù)解密,反序列化生成最初的數(shù)據(jù)字符串。
-
全局都在引用的數(shù)據(jù)
- sc_to_user_id={}——表示映射關(guān)系為 sc->user_id 的字典;
- user_id_to_sc={}——表示映射關(guān)系為 user_id-> 的字典;
- socket_to_sc={}——表示 socket 和已生成 sc 對(duì)象的映射關(guān)系字典;
- scs=[]——存儲(chǔ)所有運(yùn)行出來的 sc(secure_channel)對(duì)象;
- chat_history=[]——用于暫時(shí)存儲(chǔ)聊天信息歷史。
-
客戶端接收到的數(shù)據(jù) data
data 是一部字典,它包括 key:parameters,type.parameters 也是一部字典,內(nèi)部包括 key:target_type,time,sender_id(發(fā)送者 id),target_id(接收方 id),sender_name(接收者姓名,message 字典(內(nèi)含數(shù)據(jù)內(nèi)容,字體,字體大小顏色)。而外層的這個(gè) type 存儲(chǔ)的是交給 server 的 MessageType 類型,如果是不同的 MessageType 會(huì)進(jìn)行不同的數(shù)據(jù)庫操作和客戶端操作。具體實(shí)例如下:
data={ 'parameters':{ 'target_type':0, 'time':1562754761321, 'sender_id':1, 'target_id':2, 'sender_name':'1', 'message'{ 'data':'hello', 'fontsize':10, 'type':0, 'fontcolor':'#000000' } }, 'type':<MessageType.on_new_message:109> }
例子中 data[‘parameters’][‘target_type’]=0 表示文本信息,從 id 為 1 的用戶發(fā)出信息,發(fā)給 id 標(biāo)號(hào)為 2 的人,發(fā)送方昵稱為‘1’。給服務(wù)器發(fā)送的操作碼為 109。
安全傳輸
-
數(shù)據(jù)包結(jié)構(gòu)
-
消息加密算法:AES 對(duì)稱加密算法,保證消息機(jī)密性
-
消息摘要算法:MD5 算法,保證消息的完整性
-
包結(jié)構(gòu)分析
-
第一層(解密前)
通過函數(shù) struct.pack()構(gòu)造加密的數(shù)據(jù)包,結(jié)構(gòu)如下
相關(guān)代碼如下
iv1=bytes(os.urandom(16)) data_to_encrypt=serialize_message(message_type,parameters) length_of_message=len(data_to_encrypt) padding_n=math.ceil(length_of_message/16)*16-length_of_message foriinrange(0,padding_n): data_to_encrypt+=b'\0'
其中 iv1 是 16 字節(jié)隨機(jī)數(shù)作為初始向量。要加密的數(shù)據(jù)是序列化的初始數(shù)據(jù)。獲取長(zhǎng)度后用\0 填充。然后將數(shù)據(jù)用 python 庫函數(shù) aes,cbc 模式加密得到加密數(shù)據(jù)。
-
第二層(解密后)
結(jié)構(gòu)如下
-
MessageType:event_handler_map()規(guī)定的操作碼
-
Parameter:字典參數(shù),包含 target_type(標(biāo)志群聊或者私聊)等
-
-
第三層,序列化數(shù)據(jù)的安排格式
-
第四層,基礎(chǔ)數(shù)據(jù)部分
包括 int、str、bool、float、binary 等
-
-
-
密鑰分發(fā)
-
協(xié)商過程
客戶端的證書、公鑰、私鑰
-
加密算法
采用 DH 協(xié)商對(duì)稱加密的共享密鑰,具體過程如下
-
程序函數(shù)清單
客戶端函數(shù)
-
socket_listener(self,data)
-
位置
- client/forms/register_form.py
- client/forms/login_form.py
- client/forms/contacts_form.py
- client/forms/chat_form.py
-
參數(shù)
- self:所在的類的自身
- data:監(jiān)聽數(shù)據(jù)
-
功能
在注冊(cè)、登錄、好友列表、聊天框四個(gè)頁面建立事件監(jiān)聽,解析監(jiān)聽 data,確定數(shù)據(jù)中 MessageType 的類型,在 register_form.py 文件中用于判斷用戶名是否被占用、返回注冊(cè)結(jié)果;在 login_form.py 中用于返回登錄結(jié)果;在 contacts_form.py 文件中用于判斷是否處理添加、刪除好友、添加、創(chuàng)建群聊以及執(zhí)行操作的結(jié)果、判斷好友是否下線并刷新好友列表。
-
-
remove_socket_listener_and_close(self)
-
位置
- client/forms/register_form.py
- client/forms/login_form.py
- client/forms/contacts_form.py
- client/forms/chat_form.py
-
參數(shù)
- self:所在的類的自身:RegisterForm、LoginForm、ContactsForm、ChatForm
-
功能
通過調(diào)用 util/socket_listener 文件下的 remove_listener 函數(shù)來關(guān)閉事件監(jiān)聽,同時(shí)調(diào)用庫函數(shù) destroy()關(guān)閉窗口、清空客戶端緩存信息。
-
-
_init_(self,master=None)
-
位置
- client/forms/register_form.py
-
參數(shù)
- self:所在類 RegisterForm 自身
- master:注冊(cè)主窗口用來容納其他組件,默認(rèn)一個(gè)窗口 master=None
-
功能
通過庫函數(shù) super()實(shí)現(xiàn)子類__init__()對(duì)父類__init__()的繼承;對(duì)注冊(cè)窗口進(jìn)行布局,包括確定注冊(cè)界面的長(zhǎng)寬,確定背景、標(biāo)簽、輸入框、按鈕等的位置、顏色、類型、鏈接等;初始化安全信道;通過 socket_listener()函數(shù)和 remove_socket_listener_and_close()函數(shù)控制對(duì)客戶端 socket 事件監(jiān)聽和關(guān)閉。
-
-
do_register(self)
-
位置
- client/forms/register_form.py
-
參數(shù)
- self:所在類 RegisterForm 自身
-
功能
檢查輸入的用戶名、密碼、郵箱是否合法;判斷兩次輸入的密碼是否相同;調(diào)用 get_ip()函數(shù)獲取客戶端的 IP 地址和端口號(hào);向服務(wù)器發(fā)送注冊(cè)請(qǐng)求,并通過調(diào)用函數(shù) send()將注冊(cè)輸入的用戶名、密碼、郵箱、性別、年齡以及用戶的 IP 地址和端口號(hào)等信息發(fā)送給服務(wù)器;構(gòu)造數(shù)字證書,命名為 IP 地址 +“——cert.pem”,內(nèi)容為用戶名 + 郵箱 + 用戶公鑰
-
-
._init_(self,master=None)
-
位置
- client/forms/login_form.py
-
參數(shù)
- self:所在類 RegisterForm 自身
- master:登錄主窗口用來容納其他組件,默認(rèn)一個(gè)窗口 master=None
-
功能
通過庫函數(shù) super()實(shí)現(xiàn)子類__init__()對(duì)父類_init_()的繼承;對(duì)登錄窗口進(jìn)行布局,包括確定注冊(cè)界面的長(zhǎng)寬,確定背景、標(biāo)簽、輸入框、按鈕等的位置、顏色、類型、鏈接等;初始化安全信道;通過 socket_listener()函數(shù)和 add_listener()函數(shù)將服務(wù)器端加入到監(jiān)聽列表中。
-
-
do_login(self)
-
位置
- client/forms/login_form.py
-
參數(shù)
- 參數(shù) self:所在類 LoginForm 自身
-
功能
檢查輸入的用戶名、密碼是否合法;通過調(diào)用函數(shù) send()向服務(wù)器發(fā)送登錄請(qǐng)求,并將輸入的用戶名、密碼等信息發(fā)送給服務(wù)器。
-
-
show_register(self)
-
位置
- client/forms/login_form.py
-
參數(shù)
- self:所在類 LoginForm 自身
-
功能
與注冊(cè)按鈕關(guān)聯(lián),通過點(diǎn)擊按鈕調(diào)用庫函數(shù) Toplevel()跳轉(zhuǎn)到注冊(cè)頁面。
-
-
._init_(self,master=None)
-
位置
- client/forms/contacts_form.py
-
參數(shù)
- self:所在類 ContactsForm 自身
- master:登錄主窗口用來容納其他組件,默認(rèn)一個(gè)窗口 master=None。
-
功能
通過庫函數(shù) super()實(shí)現(xiàn)子類_init__()對(duì)父類__init_()的繼承;對(duì)好友列表窗口布局,確定好友列表的長(zhǎng)寬、按鈕的位置、顏色、類型、鏈接等;調(diào)用 VerticalScrolledFrame()函數(shù),將列表設(shè)置滾動(dòng)條 + 圖片背景;初始化安全信道;通過 socket_listener()函數(shù)和 remove_socket_listener_and_close()函數(shù)控制對(duì)客戶端 socket 事件監(jiān)聽和關(guān)閉。
-
-
refresh_contacts(self)
-
位置
- client/forms/contacts_form.py
-
參數(shù)
- self:所在類 ContactsForm 自身
-
功能
通過比較與好友或群聊最近一次發(fā)消息的時(shí)間 last_message_timestamp 和好友的在線情況刷新好友列表,根據(jù)好友或群聊發(fā)送消息的時(shí)間遠(yuǎn)近對(duì)好友列表進(jìn)行排列,并將在線好友移至列表頂部
-
-
on_add_friend(self)/on_del_friend(self)/on_add_room(self)on_create_room(self)
-
位置
- client/forms/contacts_form.py
-
參數(shù)
- self:所在類 ContactsForm 自身
-
功能
與添加好友、刪除好友、添加群聊、創(chuàng)建群聊四個(gè)按鈕鏈接;使用庫函數(shù) simpledialog.askstring()彈出輸入框,并對(duì)輸入的內(nèi)容進(jìn)行檢驗(yàn);使用函數(shù) send()向服務(wù)器發(fā)送操作請(qǐng)求。
-
-
handle_new_contact(self,data)
-
位置
- client/forms/contacts_form.py
-
參數(shù)
- self:所在類 ContactsForm 自身
- data:接收的數(shù)據(jù)
-
功能
被該文件下的另一個(gè)函數(shù)__init__()調(diào)用用來添加或刪除列表中的好友。
-
-
_init_(self,target,master=None)
-
位置
- client/forms/chat_form.py
-
參數(shù)
- self:所在類 ChatFrame 自身
- target:一個(gè)用來暫時(shí)存儲(chǔ)消息的列表
- master:聊天框主窗口用來容納其他組件,默認(rèn)一個(gè)窗口 master=None
-
功能
對(duì)聊天框布局,確定聊天框的長(zhǎng)寬、輸入框、消息框、按鈕的位置、顏色、類型、鏈接等;分辨私人聊天和群聊;利用 append_to_chat_box()函數(shù)加載、更新歷史消息。
-
-
send_message(self)/send_file(self)
-
位置
- client/forms/chat_form.py
-
參數(shù)
- self:所在類 ChatFrame 自身
-
功能
通過調(diào)用 input_textbox.get()函數(shù)和 filedialog.askopenfilename()函數(shù)實(shí)現(xiàn)發(fā)送消息和文件。
-
-
digest_message(self,data)
-
位置
- client/forms/chat_form.py
-
參數(shù)
- self:所在類 ChatFrame 自身
- data:傳輸?shù)臄?shù)據(jù)
-
功能
通過分析傳輸?shù)臄?shù)據(jù)包,摘取消息的時(shí)間戳、發(fā)送者、消息類型,為布局做準(zhǔn)備。
-
-
_init_(self,parent,onclick)
-
位置
- client/components/contact_item.py
-
參數(shù)
- self:所在類 ContactItem 自身
- parent:向函數(shù)內(nèi)定義的子類傳遞的參數(shù)
- onclick:跳轉(zhuǎn)動(dòng)作
-
功能
位于 ContactItem 類中,對(duì)好友列表中的每一行進(jìn)行布局如
-
-
_init_(self,parent,*args,**kw)
-
位置
- client/components/vertical_scrolled_frame.py
-
參數(shù)
- self:所在類 VerticalScrolledFrame 自身
- parent:向函數(shù)內(nèi)定義的子類傳遞的參數(shù)
- *args:可變參數(shù)
- **kw:關(guān)鍵字參數(shù)
-
功能
利用 Scrollbar()函數(shù)創(chuàng)建一個(gè)帶有滾動(dòng)條的畫布,并可以通過滾動(dòng)條對(duì)畫布及時(shí)更新。
-
common 函數(shù)
-
gen_secret()
-
位置
- common\cryptography\crypt.py
-
功能
產(chǎn)生用戶的公鑰私鑰
-
算法描述
利用 prime.generate_big_prime()函數(shù)產(chǎn)生一個(gè)大的素?cái)?shù)作為私鑰,然后利用相應(yīng)算法計(jì)算出自己的公鑰,將公鑰和私鑰保存成文件,公鑰可寫入證書,私鑰單獨(dú)保存不傳輸
-
-
_serialize_xxx(xxx)
-
位置
- common\message_init_.py
-
參數(shù):要序列化的數(shù)據(jù)類型
-
功能
針對(duì)傳入的不同數(shù)據(jù)類型進(jìn)行序列化算法描述:對(duì)不同數(shù)據(jù)類型進(jìn)行序列化成二進(jìn)制然后返回統(tǒng)一格式的數(shù)據(jù),方便進(jìn)行數(shù)據(jù)的傳輸和存好友的用戶名和在線狀態(tài)最近一次消息時(shí)間好友的 IP 地址和端口號(hào)消息內(nèi)容未讀消息計(jì)數(shù)儲(chǔ)。每個(gè)序列化后的數(shù)據(jù)格式為:|——VAR_TYPE(1Byte)——|——DATA_LEN(4Bytes)——|——DATA——|。即 1 字節(jié)數(shù)據(jù)類型,4 字節(jié)數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)部分。
主要用_serialize_list(list):_serialize_list(list)數(shù)據(jù)打包格式如下:|——1ByteTypeofparams——|——4BytesLengthofbody——|——Body(self-evidentlength)——|——Body(selfevidentlength)——|——Body(self-evidentlength)——|…即第一字節(jié)為列表類型,然后 4 字節(jié)的數(shù)據(jù)長(zhǎng)度,由每種數(shù)據(jù)類型占用長(zhǎng)度不同分配不同的 BODY 長(zhǎng)度,每一個(gè) BODY 可以是如 list,int,float 等數(shù)據(jù)類型。
-
-
_deserialize_xxx(bytes)
-
位置
- common\message_init_.py
-
參數(shù):二進(jìn)制數(shù)據(jù)
-
功能
針對(duì)傳入的不同數(shù)據(jù)類型數(shù)據(jù)進(jìn)行反序列化成原本數(shù)據(jù)
-
算法描述
對(duì)二進(jìn)制進(jìn)行反序列成指定的數(shù)據(jù)類型,即是_serialize_xxx 的逆過程,可用于解析數(shù)據(jù)包。
-
-
send(self,message_type,parameters=None)
-
位置
- common\transmission\secure_channel.py
-
參數(shù)
- self 即為 SecureChannel 類
- message_type 即為消息的類型
-
功能
按照自制的協(xié)議組織數(shù)據(jù)包發(fā)送數(shù)據(jù)包
-
算法描述
數(shù)據(jù)包的格式為前四個(gè)字節(jié)為消息體的長(zhǎng)度,接著一字節(jié)存儲(chǔ) AES 加密時(shí)的消息填充長(zhǎng)度,然后 16 字節(jié) AES 加密時(shí)所需要的初始值,再接著是 32 字節(jié)的消息摘要,最后才是加密后的消息體。
-
-
on_data(self,data_array)
-
位置
- common\transmission\secure_channel.py
-
參數(shù)
- self 即為 SecureChannel 類
- data_array 即為字節(jié)數(shù)組
-
功能
解析數(shù)據(jù)包,并利用 mac 驗(yàn)證消息的完整性
-
算法描述
首先把 bytes([padding_n])+iv1+encrypted_message 傳給本函數(shù),然后得到消息體,和消息摘要,接收方對(duì)消息利用相同的算法計(jì)算其消息摘要,驗(yàn)證消息是否被篡改最后對(duì)消息解密,返回解密后的反序列化后的原始數(shù)據(jù)。
-
-
establish_secure_channel_to_server()
-
位置
- common\transmission\secure_channel.py
-
功能
與集中服務(wù)器建立安全信道
-
算法描述
客戶端首先獲取本機(jī)的 ip 地址,生成自己的私鑰公鑰和證書,首次連接的時(shí)候要給服務(wù)器發(fā)送證書,計(jì)算出二者的共同密鑰。
-
-
accept_client_to_secure_channel(socket)
-
位置
- common\transmission\secure_channel.py
-
參數(shù)
- socket:客戶端和服務(wù)器通信的 socket
-
功能
服務(wù)器接收客戶端建立安全信道
-
算法描述
首次連接,客戶端會(huì)發(fā)送公鑰,把服務(wù)器的證書發(fā)送給客戶端,二者計(jì)算出共同密鑰。
-
-
gen_last_message(obj)
-
位置
- common\utli\socket_listener\__init__.py
-
參數(shù)
- obj 為傳輸數(shù)據(jù) data 的 obj 類型
-
功能
獲取對(duì)象中 message 的類型,0 表示文字信息,1 表示圖片信息
-
算法描述
obj[‘message’][‘type’]判斷 0 與 1.type0-文字消息 1-圖片消息。
-
-
socket_listener_thread(sc,tk_root)
-
位置
- common\socket_listener__init.py
-
參數(shù)
- sc 是已經(jīng)建立的 C-S 安全 socket,socket_channel,帶有對(duì)稱秘鑰
- tk_root 是 tkinter 界面對(duì)象。
-
功能
循環(huán)接收信息,進(jìn)入 socket 監(jiān)聽狀態(tài),當(dāng)接受到信息后完整的接收數(shù)據(jù)包并從中獲取操作碼,根據(jù)操作碼的不同進(jìn)行不同的處理。
-
算法描述
使用 select.select 函數(shù)阻塞運(yùn)行,當(dāng)有處理時(shí)不會(huì)被其他人占用。其中接受數(shù)據(jù)有三個(gè)變量:
- bytes_to_receive=0
- bytes_received=0
- data_buffer=bytes()
當(dāng) bytes_to_receive=0、bytes_received=0 時(shí)表示正準(zhǔn)備接受一個(gè)新的 socket 數(shù)據(jù)。開始接收后會(huì)通過數(shù)據(jù)包前四個(gè)字節(jié)判斷長(zhǎng)度。如果長(zhǎng)度小于四字節(jié)說明是損壞的包或者是空包,沒有數(shù)據(jù),表示服務(wù)器已關(guān)閉。通過指針[0]+1+16 使指針指向數(shù)據(jù)部分。+1 是 aes 的填充部分 1 字節(jié),+16 是 aes 初始向量 4 字節(jié)。直到接收完畢為止。接受完會(huì)把數(shù)據(jù)包解包取出數(shù)據(jù)部分,并不斷拼接形成完整數(shù)據(jù)字符串。
-
-
digest_message(data,update_unread_count=True)
-
位置
- common\socket_listene\__init__.py
-
參數(shù)
- data 是要放入的歷史數(shù)據(jù)
- update_unread_count 初始參數(shù)設(shè)置為 True 使消息未讀數(shù)自增
-
功能
實(shí)現(xiàn)將歷史數(shù)據(jù)放入 chat_history 列表中,更新最新消息,消息時(shí)間,消息未讀數(shù)量,并更新用戶的好友列表,在前端進(jìn)行刷新,更新聊天窗口。
-
算法描述
通過 if 像 chat_history 中的數(shù)據(jù)填入以前的數(shù)據(jù)。將 data 更新用于發(fā)送。
-
-
add_listener(func)
-
位置
- common\socket_listener\__init__.py
-
參數(shù)
- func 是一個(gè)函數(shù)
-
功能
將某一函數(shù)事件放入執(zhí)行列表中,之后會(huì)被逐個(gè)調(diào)用
-
算法描述
將 func 函數(shù) append 到 callback_funcs 待執(zhí)行函數(shù)列表中。
-
-
remove_listener(func)
-
位置
- common\socket_listener__init__.py
-
參數(shù)
- func 是一個(gè)函數(shù)
-
功能
將某一函數(shù)事件從執(zhí)行列表中移除
-
算法描述
列表的 remove 操作
-
服務(wù)器端函數(shù)
-
handler_event
-
位置
- server\event_handler_init_.py
-
參數(shù)
- sc:即為相應(yīng)的 socket;
- event_type:即為事件的類型;
- parameters:相應(yīng)事件中包含的參數(shù)。
-
功能
將不同類型的 event 映射到相應(yīng)的事件處理操作上,比如將 MessageType.login 映射到執(zhí)行 login 的處理操作上。
-
算法描述
主要是利用 map 根據(jù)提供的函數(shù)對(duì)指定事件做映射。
-
-
run
-
位置
- server\event_handler\login.py
-
參數(shù)
- sc:相應(yīng)的 socket
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊登錄按鈕后,集中服務(wù)器進(jìn)行用戶登錄后的相關(guān)操作。
-
算法描述
首先從傳入的參數(shù)中得到用戶的 username 和對(duì)應(yīng)的 password,繼而得到對(duì)數(shù)據(jù)庫的控制操作權(quán)限,查詢?cè)撚脩羰欠翊嬖冢脩裘兔艽a是否匹配。若返回值為 0,則為客戶端發(fā)送 MessageType.login_failed。下一步查看該用戶是否已經(jīng)登入,若已登入則踢下線,否則登錄成功,向客戶端發(fā)送 MessageType.login_successful。登錄成功后向客戶端發(fā)送好友列表,通知他的好友他已上線,最后從數(shù)據(jù)庫中讀出他的聊天記錄,將其和好友列表一起作為 login_bundle 的參數(shù)發(fā)送給客戶端。
-
-
run
-
位置
- server\event_handler\register.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊注冊(cè)按鈕后,集中服務(wù)器進(jìn)行用戶注冊(cè)后的相關(guān)操作
-
算法描述
首先從傳入的參數(shù)中獲取用戶名,繼而得到對(duì)數(shù)據(jù)庫的控制操作權(quán)限,查詢?cè)撚脩裘欠褚驯蛔?cè),若被注冊(cè)則向客戶端發(fā)送 MessageType.username_taken,否則的話傳入的參數(shù)中獲取用戶的 ip,重寫用戶生成的證書,然后再把用戶的信息插入到數(shù)據(jù)庫中。
-
-
run
-
位置
- server\event_handler\add_friend.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊添加好友輸入好友用戶名后,集中服務(wù)器進(jìn)行用戶添加好友后的相關(guān)操作
-
算法描述
首先從傳入的參數(shù)中得到用戶的 username,繼而得到對(duì)數(shù)據(jù)庫的控制操作權(quán)限,查詢?cè)撚脩羰欠翊嬖冢舨淮嬖谙蚩蛻舳税l(fā)送 MessageType.add_friend_result,并提示用戶“用戶名不存在”,否則根據(jù)用戶名找到用戶 id,判斷其是否為自己的 id,則提示用戶”不能加自己為好友“。再下一步查詢用戶自己的 id 和好友 id 是否已在 friends 表中,若存在,則提示用戶“已經(jīng)是好友/已經(jīng)發(fā)送過好友請(qǐng)求”,否則的話將用戶自己的 id 和好友 id 插入到 friends 表中,但是 accpted 的值為 0,因?yàn)榇藭r(shí)還不清楚對(duì)方是否同意添加你為好友。然后向用戶發(fā)送 MessageType.add_friend_result,值為 true。最后若對(duì)方在線,則向其發(fā)送 MessageType.incoming_friend_request,讓對(duì)方處理添加好友的請(qǐng)求。
-
-
run
-
位置
- server\event_handler\resolve_friend_request.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
當(dāng)有用戶向目標(biāo)用戶發(fā)送好友添加請(qǐng)求時(shí),服務(wù)器處理好友請(qǐng)求操作
-
算法描述
首先從傳入的參數(shù)中得到 uid,繼而得到對(duì)數(shù)據(jù)庫的控制操作權(quán)限,查詢 friends 表中好友關(guān)系(accepted 狀態(tài)為 0)是否在數(shù)據(jù)庫中已存在,若不存在也不進(jìn)行相關(guān)操作。若拒絕添加好友,則將數(shù)據(jù)庫中的該條數(shù)據(jù)刪除,若同意加為好友,則更新 friends 表 accepted 為 1,并且在數(shù)據(jù)庫中添加雙向關(guān)系。并給客戶端發(fā)送 MessageType.contact_info,在好友列表中顯示添加成功的好友。若對(duì)方在線,也發(fā)送 MessageType.contact_info,在好友列表中顯示添加成功的新好友。
-
-
run
-
位置
- server\event_handler\del_friend.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊刪除好友,輸入好友用戶名后,集中服務(wù)器進(jìn)行用戶刪除好友后的相關(guān)操作。
-
算法描述
首先從傳入的參數(shù)中得到用戶的 username,繼而得到對(duì)數(shù)據(jù)庫的控制操作權(quán)限,查詢?cè)撚脩羰欠翊嬖?,若不存在向客戶端發(fā)送 MessageType.add_friend_result,并提示用戶“用戶名不存在”,否則根據(jù)用戶名找到用戶 id,判斷其是否為自己的 id,則提示用戶”不能刪除自己“。再下一步判斷對(duì)方是否是自己的好友,查詢用戶自己的 id 和好友 id 是否已在 friends 表中,若不存在,則提示用戶“該用戶還不是您的好友”,若對(duì)方是自己的好友,則在 friends 表中刪除二者的好友關(guān)系,并向客戶端發(fā)送 MessageType.del_info,使刪除的好友在好友列表中消失。若對(duì)方在線,也發(fā)送 MessageType.del_info,使自己在對(duì)方好友列表中也消失,實(shí)現(xiàn)雙向的刪好友功能。
-
-
run
-
位置
- server\event_handler\create_room.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊創(chuàng)建群組聊天,輸入群組名后,集中服務(wù)器進(jìn)行創(chuàng)建群組的相關(guān)操作。
-
算法描述
首先獲取 user_id,然后將該群聊加入數(shù)據(jù)庫 rooms 中,并且向客戶端發(fā)送 MessageType.contact_info,使用戶在好友列表中顯示群聊。最后向客戶端發(fā)送 MessageType.general_msg,提示用戶創(chuàng)建群聊成功,并顯示群號(hào)。
-
-
run
-
位置
- server\event_handler\join_room.py
-
參數(shù)
- sc:相應(yīng)的 socket;
- parameters:從客戶端傳入的相關(guān)參數(shù)
-
功能
客戶端點(diǎn)擊添加群組聊天,輸入群組名后,集中服務(wù)器進(jìn)行添加群聊的相關(guān)操作。
-
算法描述
首先獲取 user_id,調(diào)用數(shù)據(jù)庫的 in_room 函數(shù)判斷用戶是否已在群中,若已在則提示用戶“已在群里了“,調(diào)用數(shù)據(jù)庫的 get_room 函數(shù)判斷群聊是否存在,若不存在提示用戶”群不存在“,否則調(diào)用 add_to_room 將用戶加入到群聊中,并向客戶端發(fā)送 MessageType.contact_info,使用戶在好友列表中顯示該群聊。
-
-
get_user(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- int 型,表示該用戶的用戶 id
-
功能
獲取數(shù)據(jù)庫中 users 表中 id 值為 user_id 的那一行的所有數(shù)據(jù)。
-
算法描述
執(zhí)行數(shù)據(jù)庫查詢語句返回一行結(jié)果。若無結(jié)果返回空。
-
-
get_pending_friend_request(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_Id,int 類型,表示某一個(gè)用戶的 id 值。
-
功能
返回一個(gè)列表,列表中的內(nèi)容為加 user_id 的用戶的好友們的個(gè)人信息。
-
算法描述
從數(shù)據(jù)庫中查詢 friends 表,to_user_id 為 user_id 的行中且為 accepted=1 的獲取 from_user,用 get_user 函數(shù)查詢他們的信息并 append 到列表中。
-
-
get_friends(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_Id,int 類型,表示某一個(gè)用戶的 id 值。
-
功能
類似 get_pending_friend_request(user_id)函數(shù),只是會(huì)返回‘我’加誰為好友且 accept 的用戶信息。
-
算法描述
從數(shù)據(jù)庫中查詢 friends 表,from_user_id 為 user_id 的行中且為 accepted=1 的獲取 to_user,用 get_user 函數(shù)查詢他們的信息并 append 到列表中。
-
-
get_room(room_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- room_id,int 類型,表示一個(gè) room 的 id 值
-
功能
返回群聊 id 為 room_id 的群聊房間在 rooms 表中的所有信息的字典,包括 id,名字
-
算法描述
從數(shù)據(jù)庫中查詢 room 表,返回對(duì)應(yīng) room_id 的 room 的全部信息,壓縮為字典并返回。
-
-
get_user_rooms(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_Id,int 類型,表示某一個(gè)用戶的 id 值。
-
功能
返回一個(gè)字典,列表中內(nèi)容為 user_id 用戶加入的群聊的 room 的全部信息。
-
算法描述
從數(shù)據(jù)庫中查詢 room_user 表,返回對(duì)應(yīng) user_id 的 room 的全部信息值,變成字典中并返回。
-
-
get_user_rooms_id(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_Id,int 類型,表示某一個(gè)用戶的 id 值。
-
功能
返回一個(gè)列表,列表中內(nèi)容為 user_id 用戶加入的群聊的 room_id。
-
算法描述
從數(shù)據(jù)庫中查詢 room_user 表,返回對(duì)應(yīng) user_id 的 room_id 的全部信息值,append 入列表中并返回。
-
-
is_friend_with(from_user_id,to_user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- from_user_id 為好友發(fā)起請(qǐng)求方
- to_user_id 為接收好友請(qǐng)求方
-
功能
返回一個(gè)判斷值 1 或者 0.判斷兩者是否為朋友。
-
算法描述
從 friends 表中查詢有無兩者建立關(guān)系的一行,若沒有,則返回 0 表示不是好友。
-
-
in_room(user_id,room_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_id 為待檢查用戶
- room_id 為待檢查群聊號(hào)
-
功能
判斷 user_id 用戶是否在 room_id 的群聊中。
-
算法描述
從 room_user 表中查詢有無兩者建立關(guān)系的一行,若沒有,則返回 0 表示不是不在群聊中。
-
-
add_to_room(user_id,room_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_id 為待檢查用戶
- room_id 為待檢查群聊號(hào)
-
功能
將用戶 id 為 user_id 的用戶加入到 room_id 的群聊中。
-
算法描述
數(shù)據(jù)庫 insert 將 user_id 插入到 room_id 的 room_user 表中。
-
-
get_room_members_id(room_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- room_id 為待檢查群聊號(hào)
-
功能
獲取群聊中的所有用戶 id。
-
算法描述
select 逐一查詢,將結(jié)果返回入列表。
-
-
add_to_chat_history(user_id,target_id,target_type,data,sent)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_Id 是發(fā)送者 id
- target_id 是目標(biāo)用戶 id
- target_type 是數(shù)據(jù)類型,0 表示文本信息,1 表示圖像文件信息
- data 是傳輸存儲(chǔ)的數(shù)據(jù)
- sent 標(biāo)志位記錄是否發(fā)送成功。若為 0,下一次還會(huì)再發(fā)送。
-
功能
將聊天信息加入到正確用戶的數(shù)據(jù)庫中。
-
算法描述
將相關(guān)信息 insert 入表 chat_history 中。
-
-
get_chat_history(user_id)
-
位置
- server\util\database\__init__.py
-
參數(shù)
- user_id 為待檢查用戶
-
功能
獲取 user_id 用戶的聊天記錄。
-
算法描述
select 查詢并更新 sent 標(biāo)志位。
-
實(shí)現(xiàn)效果
-
注冊(cè)頁面
對(duì)輸入的用戶名、密碼、郵箱、確認(rèn)密碼等進(jìn)行檢查,用戶名和密碼限制輸入非法字符,郵箱限制輸入為 xxx@xxx.xxxmailto:xxx@xxx.xxx 形式,同時(shí)限制輸入的用戶名長(zhǎng)度不大于 8 個(gè),允許中文輸入。
-
登錄頁面
對(duì)輸入的用戶名和密碼進(jìn)行檢查,限制輸入非法字符,同 時(shí)限制輸入的用戶名長(zhǎng)度不大于 8 個(gè),允許中文輸入。
-
好友列表
好友列表會(huì)顯示所有好友的在線狀態(tài)、IP 地址、端口號(hào)、最新消息和未讀消息, 好友列表根據(jù)用戶離線、在線情況對(duì)列表進(jìn)行刷新,將在線和最近聊天用戶置頂。
-
添加好友
-
添加好友時(shí)需要輸入用戶名,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,不能添加自 己為好友。
-
要添加的好友用戶名必須為已經(jīng)注冊(cè)的用戶,否則會(huì)顯示用戶名不存在。
-
輸入正確用戶名并點(diǎn)擊 OK 后,會(huì)顯示好友請(qǐng)求已發(fā)送。
-
如果在線,會(huì)顯示好友請(qǐng)求,點(diǎn)擊 YSE 后,會(huì)在雙方的好友列表中添加;點(diǎn)擊 NO 后兩個(gè)用戶無法成為好友;點(diǎn)擊 cancle 后,下次登陸時(shí)會(huì)再次彈出好友請(qǐng)求框。
-
-
刪除好友
-
與添加好友相同,需要輸入用戶名,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,不能刪 除自己。
-
不能刪除好友列表中不存在的用戶。
-
輸入正確用戶名并點(diǎn)擊 OK 后,會(huì)顯示成功刪除好友,并且好友列表進(jìn)行刷新刪除 剛剛刪除的好友信息,刪除用戶也會(huì)對(duì)好友列表進(jìn)行刷新,即雙方向刪除。
-
-
添加群聊
需要輸入要添加的群聊的群號(hào),同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,如果群號(hào) 不存在則無法添加,同樣如果已經(jīng)在群聊中,會(huì)顯示已經(jīng)在群聊中。
-
創(chuàng)建群聊
需要輸入創(chuàng)建的群聊的群名稱,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,如果群名 稱已存在,則無法創(chuàng)建,創(chuàng)建成功后會(huì)分配一個(gè)群號(hào)。
-
群聊界面
-
在群聊界面中,用戶可以直接發(fā)送消息,也可以點(diǎn)擊發(fā)送文件按鈕發(fā)送文件,聊天 框會(huì)顯示用戶名、發(fā)送時(shí)間和消息內(nèi)容,不同用戶名顏色不同,歷史消息會(huì)進(jìn)行緩 存,用戶再次打開聊天框時(shí)會(huì)直接顯示。
-
用戶可以根據(jù)自己的習(xí)慣更改字體大小。
-
用戶可以根據(jù)自己的習(xí)慣更改字體顏色。
-
-
用戶聊天界面
和群聊界面基本相同,用戶聊天內(nèi)容會(huì)緩存到客戶端文件夾中,發(fā)送的文件會(huì)存 儲(chǔ)到專用文件夾中,如下圖。
待優(yōu)化
正常信息交互流程,server 端會(huì)返回加密數(shù)據(jù),此時(shí) client 會(huì)一直等待接收 (while true)。如果發(fā)的太大,server 端加密不出來,client 一直監(jiān)聽,導(dǎo)致 client 無法再次發(fā)起操作。
以正常的發(fā)送圖片數(shù)據(jù)抓包為例子,server 會(huì)不斷接收,然后做加密。
文章來源:http://www.zghlxwxcb.cn/news/detail-592440.html
資源下載地址:https://download.csdn.net/download/sheziqiong/85596120
資源下載地址:https://download.csdn.net/download/sheziqiong/85596120
到了這里,關(guān)于基于python的安全即時(shí)通訊系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!