国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于python的安全即時(shí)通訊系統(tǒng)

這篇具有很好參考價(jià)值的文章主要介紹了基于python的安全即時(shí)通訊系統(tǒng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

資源下載地址: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 的聊天軟件;

需求分析

功能需求

  1. 聊天客戶端

    1. 注冊(cè):用戶與集中服務(wù)器通信完成注冊(cè),包括用戶名、密碼、郵箱、性別、年齡、數(shù)字證書等信息傳輸,其中數(shù)字證書包含公鑰、用戶名、郵箱等信息。私鑰單獨(dú)保存在客戶端一個(gè)文件夾下不進(jìn)行傳輸;能顯示用戶名、郵箱不符合格式規(guī)范或者重復(fù),空輸入等錯(cuò)誤信息。
    2. 認(rèn)證登錄:客戶端與集中服務(wù)器通信完成用戶名、口令認(rèn)證登錄;能顯示用戶名、密碼錯(cuò)誤導(dǎo)致的登錄錯(cuò)誤信息。還有已登錄賬號(hào)再次登錄時(shí)的多重登錄檢驗(yàn),并將之前登陸的賬號(hào)頂下去。
    3. 好友管理:用戶可通過服務(wù)器進(jìn)行搜索、添加、刪除好友。
    4. 即時(shí)通信:用戶通過客戶端實(shí)現(xiàn)與好友的聊天,包括文字、圖片傳輸。文字可實(shí)現(xiàn)字體顏色和大小的改變。
    5. 聊天記錄:客戶端能夠保存聊天記錄并且可以查看聊天記錄。
    6. 消息加解密:采用 D-H 體制協(xié)商加密秘鑰,用對(duì)稱密碼 AES 算法進(jìn)行加解密。
    7. 消息摘要:使用 MD5 算法實(shí)現(xiàn)消息摘要認(rèn)證功能,確保發(fā)送消息的完整性。
    8. 用戶未讀消息提醒:紅點(diǎn)標(biāo)注未讀消息數(shù)目,并按最后發(fā)送消息時(shí)間排列好友列表。
    9. 用戶離線后消息處理:用戶上線后及時(shí)接收到離線時(shí)好友發(fā)送的消息。

    功能結(jié)構(gòu)圖

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  2. 集中服務(wù)器

    1. 用戶注冊(cè):與用戶通信完成注冊(cè),對(duì)用戶名和郵箱格式、是否重復(fù),輸入不規(guī)范等做必要的檢驗(yàn),接收客戶端的數(shù)字證書,發(fā)送服務(wù)端數(shù)字證書。
    2. 登錄驗(yàn)證:用戶登錄時(shí),驗(yàn)證用戶名和密碼是否正確,并向客戶端返回登錄結(jié)果。如信息正確,就將在線好友用戶發(fā)給該用戶,將該用戶的狀態(tài)發(fā)給各在線好友用戶,同時(shí)在服務(wù)器端顯示出來。
    3. 用戶公鑰,證書提供:用戶向好友發(fā)送消息時(shí),與服務(wù)器建立安全連接獲取好友的證書信息,服務(wù)器控制 client.socket 像好友用戶發(fā)送信息,實(shí)現(xiàn)用戶之間的通信。
    4. 用戶在線狀態(tài)維護(hù):當(dāng)用戶在線時(shí),記錄保存用戶的在線狀態(tài)、IP 地址、端口號(hào)。
    5. 用戶消息列表實(shí)時(shí)發(fā)放:由監(jiān)聽函數(shù)將操作實(shí)時(shí)加入到執(zhí)行函數(shù)列表中遞歸執(zhí)行。向用戶發(fā)送其好友列表的在線離線情況,包括好友用戶名、IP 地址、端口號(hào)。并按照最后發(fā)消息的時(shí)間對(duì)好友消息列表進(jìn)行排序。

    功能結(jié)構(gòu)圖

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  3. 高級(jí)功能

    1. 離線用戶消息通知:暫時(shí)存儲(chǔ)離線用戶的消息,用戶上線后,顯示未讀的消息并用紅點(diǎn)標(biāo)注;
    2. 好友在線離線功能實(shí)時(shí)更新;
    3. 限制賬號(hào)只能一處登錄:一個(gè)賬號(hào)只能在一處登錄,在別處登錄時(shí)會(huì)把原先的登錄踢下線;
    4. 支持群聊功能:可以創(chuàng)建群聊,并根據(jù)群號(hào)加入群聊;
    5. 聊天時(shí)字體大小顏色可更改;
    6. 支持聊天各類圖像文件的緩存。

數(shù)據(jù)需求

  1. 客戶端

    客戶端登錄后加過的好友和加入的群聊需要從數(shù)據(jù)庫中調(diào)出信息并在前端反饋呈現(xiàn)出來。客戶端的聊天記錄可以存儲(chǔ)在數(shù)據(jù)庫中,用到時(shí)直接讀取返回消息歷史。

  2. 集中服務(wù)器

    1. 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 公鑰
    2. 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)
    3. 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ā)送是否成功
    4. rooms 表:群組表,包括該群組的主鍵 ID(id)、群組的名稱(room_name)。

      名稱 數(shù)據(jù)類型 主鍵 是否唯一 是否為空 備注
      id INTEGER Y Y N 群聊 ID
      room_name TEXT N Y N 群聊名
    5. 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

性能需求

  1. 可靠性需求

    保證一個(gè)用戶只能同時(shí)使用一個(gè) IP 地址登錄,客戶端不會(huì)出現(xiàn)閃退、加密無效的情況。

  2. 安全性需求

    客戶端做好完整的封裝;傳輸信息采用經(jīng)過公鑰加密機(jī)制協(xié)商的 AES 對(duì)稱加密秘鑰;服務(wù)器及時(shí)更新客戶端 IP 地址等信息。

  3. 可維護(hù)性與可擴(kuò)展性需求

    對(duì)于軟件功能方面,采用高內(nèi)聚低耦合的模塊化設(shè)計(jì),包括登錄模塊、注冊(cè)模塊、好友列表模塊、聊天模塊等,確保每個(gè)模塊的具有較高的獨(dú)立性,使軟件源碼便于維護(hù),同時(shí)便于后期添加聊天群等更多擴(kuò)展內(nèi)容,保證軟件可以進(jìn)行更新?lián)Q代。

  4. 運(yùn)行環(huán)境需求

    1. 客戶端:python3

    2. 服務(wù)端:

      python3

      PC 硬盤容量:50G

      運(yùn)行內(nèi)存:2G

UI 需求

  1. 頁面內(nèi)容:聊天字體大小和顏色可更改,主題突出,語言簡(jiǎn)單明了易懂,菜單設(shè)置合理、頁面布局規(guī)范,文字準(zhǔn)確,語言流暢。
  2. 技術(shù)環(huán)境:頁面大小合適,無錯(cuò)誤鏈接和空鏈接。
  3. 藝術(shù)風(fēng)格:界面版面形象清晰,布局合理,字號(hào)大小適宜,字體選擇合理,前后一致,動(dòng)靜搭配恰當(dāng),色彩和諧自然,與主題內(nèi)容協(xié)調(diào)。

操作需求

  1. 所有彈出的窗口不超過一層,無層層堆疊的現(xiàn)象,不能無故為操作增加復(fù)雜度。
  2. 用戶注冊(cè)、用戶登錄、添加好友、刪除好友聊天窗口的開啟等所有操作務(wù)必要簡(jiǎn)單、快捷,限制在兩次點(diǎn)擊以內(nèi)。
  3. 考慮到操作人員工作的實(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ù)庫操作
  1. 聊天客戶端 client

    實(shí)現(xiàn)安全即時(shí)通信系統(tǒng)的客戶端,主要功能是通過界面與用戶實(shí)現(xiàn)交互;通過 socket 與集中服務(wù)器進(jìn)行通信,獲得集中服務(wù)器的服務(wù),實(shí)現(xiàn)用戶的注冊(cè)登錄等功能。與好友即時(shí)通信和加入群聊通信。

    1. 登錄模塊 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 界面。
    2. 注冊(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è)成功,并且在客戶端生成證書包含用戶的用戶名,郵箱,公鑰。
    3. 主界面 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ì)好友列表排序。
    4. .聊天界面 ChatForm
      該模塊是用戶與好友聊天的界面。當(dāng)用戶在好友列表中點(diǎn)擊好友列表時(shí),即向好友發(fā)出聊天,服務(wù)器收到聊天請(qǐng)求后尋找對(duì)方的證書,找到對(duì)方的公鑰,雙方使用 Diffie-Hellman 算法協(xié)商算法,然后利用 AES 加密消息保證消息的機(jī)密性,MD5 生成消息摘要驗(yàn)證保證消息的完整性。另外還可以更改聊天過程中字體的大小和顏色,支持多行輸入,支持發(fā)送文件,以圖片為例,將保存聊天過程中的接收到的圖片,并識(shí)別其格式。
    5. 客戶端部件(components)模塊
      該模塊實(shí)現(xiàn) tkinter 靜態(tài)部件添加和滾動(dòng)模塊的實(shí)現(xiàn)。
    6. 客戶端 memory 管理模塊(memory)
      該模塊用于初始化 tkinter 對(duì)象 tk 的屬性,如窗口,secure_channel 對(duì)象等。
    7. 多用(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ù)目等。
  2. 集中服務(wù)器 server

    1. event_handler 模塊
      該模塊分為 11 個(gè)部分,分別具體處理客戶端發(fā)來的各個(gè)操作事件。如登錄加好友刪除好友等操作。
    2. database 數(shù)據(jù)庫模塊
      該模塊主要是根據(jù)客戶端觸發(fā)的事件對(duì)數(shù)據(jù)庫的各種操作。
    3. broadcast 廣播模塊
      該模塊主要是針對(duì)群聊,為群組中的每個(gè)在線用戶廣播發(fā)送消息。
    4. memory 模塊
      定義用戶與 secure_channel 對(duì)象互相映射的字典列表,所有已經(jīng)建立的 secure_channel 對(duì)象,以及用戶下線后將其從在線 secure_channel 對(duì)象列表中移除的操作。
  3. 客戶端服務(wù)器公用模塊 common

    1. message 模塊
      將變量數(shù)據(jù)等變成可存儲(chǔ)或者傳輸?shù)倪^程即序列化,同時(shí)還將各個(gè)事件的類型變?yōu)槊杜e變量保存,將收到的數(shù)據(jù)包反序列化進(jìn)行恢復(fù),再提取數(shù)據(jù)包中 Message 的類型。
    2. cryptography 模塊
      用于調(diào)用其生成公鑰,然后從證書中獲取公鑰,再使用 D-H 算法協(xié)商生成共享密鑰。
    3. prime 模塊
      該模塊主要是判斷是否為素?cái)?shù),生成大素?cái)?shù),為證書的生成提供基礎(chǔ)。
    4. 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é)的消息摘要,最后才是加密后的消息體。

重要數(shù)據(jù)說明

  1. 發(fā)送接收的數(shù)據(jù)格式

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  2. 接收數(shù)據(jù)時(shí)的三個(gè)字典

    1. bytes_to_receive={}——用于存儲(chǔ)對(duì)應(yīng)用戶 id 或者服務(wù)器的將要接收的數(shù)據(jù);
    2. bytes_received={}——用于標(biāo)識(shí)已經(jīng)接收的數(shù)據(jù);
    3. data_buffer={}——用于將已經(jīng)接收的數(shù)據(jù)解密,反序列化生成最初的數(shù)據(jù)字符串。
  3. 全局都在引用的數(shù)據(jù)

    1. sc_to_user_id={}——表示映射關(guān)系為 sc->user_id 的字典;
    2. user_id_to_sc={}——表示映射關(guān)系為 user_id-> 的字典;
    3. socket_to_sc={}——表示 socket 和已生成 sc 對(duì)象的映射關(guān)系字典;
    4. scs=[]——存儲(chǔ)所有運(yùn)行出來的 sc(secure_channel)對(duì)象;
    5. chat_history=[]——用于暫時(shí)存儲(chǔ)聊天信息歷史。
  4. 客戶端接收到的數(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。

安全傳輸

  1. 數(shù)據(jù)包結(jié)構(gòu)

    1. 消息加密算法:AES 對(duì)稱加密算法,保證消息機(jī)密性

    2. 消息摘要算法:MD5 算法,保證消息的完整性

    3. 包結(jié)構(gòu)分析

      1. 第一層(解密前)

        通過函數(shù) struct.pack()構(gòu)造加密的數(shù)據(jù)包,結(jié)構(gòu)如下

        基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

        相關(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ù)。

      2. 第二層(解密后)

        結(jié)構(gòu)如下

        基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

        • MessageType:event_handler_map()規(guī)定的操作碼

          基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

        • Parameter:字典參數(shù),包含 target_type(標(biāo)志群聊或者私聊)等

      3. 第三層,序列化數(shù)據(jù)的安排格式

        基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

      4. 第四層,基礎(chǔ)數(shù)據(jù)部分

        包括 int、str、bool、float、binary 等

        基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  2. 密鑰分發(fā)

    1. 協(xié)商過程

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

      客戶端的證書、公鑰、私鑰

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    2. 加密算法

      采用 DH 協(xié)商對(duì)稱加密的共享密鑰,具體過程如下

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

程序函數(shù)清單

客戶端函數(shù)
  1. 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é)果、判斷好友是否下線并刷新好友列表。

  2. 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)閉窗口、清空客戶端緩存信息。

  3. _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)閉。

  4. 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)容為用戶名 + 郵箱 + 用戶公鑰

  5. ._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)聽列表中。

  6. do_login(self)

    • 位置

      • client/forms/login_form.py
    • 參數(shù)

      • 參數(shù) self:所在類 LoginForm 自身
    • 功能

      檢查輸入的用戶名、密碼是否合法;通過調(diào)用函數(shù) send()向服務(wù)器發(fā)送登錄請(qǐng)求,并將輸入的用戶名、密碼等信息發(fā)送給服務(wù)器。

  7. 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è)頁面。

  8. ._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)閉。

  9. refresh_contacts(self)

    • 位置

      • client/forms/contacts_form.py
    • 參數(shù)

      • self:所在類 ContactsForm 自身
    • 功能

      通過比較與好友或群聊最近一次發(fā)消息的時(shí)間 last_message_timestamp 和好友的在線情況刷新好友列表,根據(jù)好友或群聊發(fā)送消息的時(shí)間遠(yuǎn)近對(duì)好友列表進(jìn)行排列,并將在線好友移至列表頂部

  10. 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)求。

  11. handle_new_contact(self,data)

    • 位置

      • client/forms/contacts_form.py
    • 參數(shù)

      • self:所在類 ContactsForm 自身
      • data:接收的數(shù)據(jù)
    • 功能

      被該文件下的另一個(gè)函數(shù)__init__()調(diào)用用來添加或刪除列表中的好友。

  12. _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ù)加載、更新歷史消息。

  13. 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ā)送消息和文件。

  14. digest_message(self,data)

    • 位置

      • client/forms/chat_form.py
    • 參數(shù)

      • self:所在類 ChatFrame 自身
      • data:傳輸?shù)臄?shù)據(jù)
    • 功能

      通過分析傳輸?shù)臄?shù)據(jù)包,摘取消息的時(shí)間戳、發(fā)送者、消息類型,為布局做準(zhǔn)備。

  15. _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)行布局如

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  16. _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ù)
  1. gen_secret()

    • 位置

      • common\cryptography\crypt.py
    • 功能

      產(chǎn)生用戶的公鑰私鑰

    • 算法描述

      利用 prime.generate_big_prime()函數(shù)產(chǎn)生一個(gè)大的素?cái)?shù)作為私鑰,然后利用相應(yīng)算法計(jì)算出自己的公鑰,將公鑰和私鑰保存成文件,公鑰可寫入證書,私鑰單獨(dú)保存不傳輸

  2. _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ù)類型。

  3. _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ù)包。

  4. 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é)的消息摘要,最后才是加密后的消息體。

  5. 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ù)。

  6. establish_secure_channel_to_server()

    • 位置

      • common\transmission\secure_channel.py
    • 功能

      與集中服務(wù)器建立安全信道

    • 算法描述

      客戶端首先獲取本機(jī)的 ip 地址,生成自己的私鑰公鑰和證書,首次連接的時(shí)候要給服務(wù)器發(fā)送證書,計(jì)算出二者的共同密鑰。

  7. accept_client_to_secure_channel(socket)

    • 位置

      • common\transmission\secure_channel.py
    • 參數(shù)

      • socket:客戶端和服務(wù)器通信的 socket
    • 功能

      服務(wù)器接收客戶端建立安全信道

    • 算法描述

      首次連接,客戶端會(huì)發(fā)送公鑰,把服務(wù)器的證書發(fā)送給客戶端,二者計(jì)算出共同密鑰。

  8. 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-圖片消息。

  9. 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ù)字符串。

  10. 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ā)送。

  11. 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ù)列表中。

  12. remove_listener(func)

    • 位置

      • common\socket_listener__init__.py
    • 參數(shù)

      • func 是一個(gè)函數(shù)
    • 功能

      將某一函數(shù)事件從執(zhí)行列表中移除

    • 算法描述

      列表的 remove 操作

服務(wù)器端函數(shù)
  1. 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ì)指定事件做映射。

  2. 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ā)送給客戶端。

  3. 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ù)庫中。

  4. 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)求。

  5. 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,在好友列表中顯示添加成功的新好友。

  6. 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)雙向的刪好友功能。

  7. 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)。

  8. 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,使用戶在好友列表中顯示該群聊。

  9. 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é)果返回空。

  10. 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 到列表中。

  11. 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 到列表中。

  12. 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 的全部信息,壓縮為字典并返回。

  13. 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 的全部信息值,變成字典中并返回。

  14. 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 入列表中并返回。

  15. 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 表示不是好友。

  16. 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 表示不是不在群聊中。

  17. 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 表中。

  18. get_room_members_id(room_id)

    • 位置

      • server\util\database\__init__.py
    • 參數(shù)

      • room_id 為待檢查群聊號(hào)
    • 功能

      獲取群聊中的所有用戶 id。

    • 算法描述

      select 逐一查詢,將結(jié)果返回入列表。

  19. 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 中。

  20. get_chat_history(user_id)

    • 位置

      • server\util\database\__init__.py
    • 參數(shù)

      • user_id 為待檢查用戶
    • 功能

      獲取 user_id 用戶的聊天記錄。

    • 算法描述

      select 查詢并更新 sent 標(biāo)志位。

實(shí)現(xiàn)效果

  1. 注冊(cè)頁面

    對(duì)輸入的用戶名、密碼、郵箱、確認(rèn)密碼等進(jìn)行檢查,用戶名和密碼限制輸入非法字符,郵箱限制輸入為 xxx@xxx.xxxmailto:xxx@xxx.xxx 形式,同時(shí)限制輸入的用戶名長(zhǎng)度不大于 8 個(gè),允許中文輸入。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  2. 登錄頁面

    對(duì)輸入的用戶名和密碼進(jìn)行檢查,限制輸入非法字符,同 時(shí)限制輸入的用戶名長(zhǎng)度不大于 8 個(gè),允許中文輸入。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  3. 好友列表

    好友列表會(huì)顯示所有好友的在線狀態(tài)、IP 地址、端口號(hào)、最新消息和未讀消息, 好友列表根據(jù)用戶離線、在線情況對(duì)列表進(jìn)行刷新,將在線和最近聊天用戶置頂。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  4. 添加好友

    1. 添加好友時(shí)需要輸入用戶名,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,不能添加自 己為好友。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    2. 要添加的好友用戶名必須為已經(jīng)注冊(cè)的用戶,否則會(huì)顯示用戶名不存在。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    3. 輸入正確用戶名并點(diǎn)擊 OK 后,會(huì)顯示好友請(qǐng)求已發(fā)送。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    4. 如果在線,會(huì)顯示好友請(qǐng)求,點(diǎn)擊 YSE 后,會(huì)在雙方的好友列表中添加;點(diǎn)擊 NO 后兩個(gè)用戶無法成為好友;點(diǎn)擊 cancle 后,下次登陸時(shí)會(huì)再次彈出好友請(qǐng)求框。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  5. 刪除好友

    1. 與添加好友相同,需要輸入用戶名,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,不能刪 除自己。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    2. 不能刪除好友列表中不存在的用戶。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    3. 輸入正確用戶名并點(diǎn)擊 OK 后,會(huì)顯示成功刪除好友,并且好友列表進(jìn)行刷新刪除 剛剛刪除的好友信息,刪除用戶也會(huì)對(duì)好友列表進(jìn)行刷新,即雙方向刪除。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  6. 添加群聊

    需要輸入要添加的群聊的群號(hào),同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,如果群號(hào) 不存在則無法添加,同樣如果已經(jīng)在群聊中,會(huì)顯示已經(jīng)在群聊中。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  7. 創(chuàng)建群聊

    需要輸入創(chuàng)建的群聊的群名稱,同時(shí)會(huì)對(duì)輸入的信息進(jìn)行合法性檢查,如果群名 稱已存在,則無法創(chuàng)建,創(chuàng)建成功后會(huì)分配一個(gè)群號(hào)。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  8. 群聊界面

    1. 在群聊界面中,用戶可以直接發(fā)送消息,也可以點(diǎn)擊發(fā)送文件按鈕發(fā)送文件,聊天 框會(huì)顯示用戶名、發(fā)送時(shí)間和消息內(nèi)容,不同用戶名顏色不同,歷史消息會(huì)進(jìn)行緩 存,用戶再次打開聊天框時(shí)會(huì)直接顯示。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    2. 用戶可以根據(jù)自己的習(xí)慣更改字體大小。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    3. 用戶可以根據(jù)自己的習(xí)慣更改字體顏色。

      基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

  9. 用戶聊天界面

    和群聊界面基本相同,用戶聊天內(nèi)容會(huì)緩存到客戶端文件夾中,發(fā)送的文件會(huì)存 儲(chǔ)到專用文件夾中,如下圖。

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

    基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

待優(yōu)化

正常信息交互流程,server 端會(huì)返回加密數(shù)據(jù),此時(shí) client 會(huì)一直等待接收 (while true)。如果發(fā)的太大,server 端加密不出來,client 一直監(jiān)聽,導(dǎo)致 client 無法再次發(fā)起操作。

基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

以正常的發(fā)送圖片數(shù)據(jù)抓包為例子,server 會(huì)不斷接收,然后做加密。

基于安全加密算法的簡(jiǎn)易通訊系統(tǒng),python,安全,服務(wù)器

資源下載地址: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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Netty+springboot開發(fā)即時(shí)通訊系統(tǒng)筆記(二)

    Netty+springboot開發(fā)即時(shí)通訊系統(tǒng)筆記(二)

    1.數(shù)據(jù)庫設(shè)計(jì),在csdn上搞定了 2.用戶單表增刪改查。 全局異常處理:RestControllerAdvice在類上,ExceptionHandler在方法上,里面有個(gè)value值,可以寫java提供的異常以及自定義異常 3.好友: 弱好友關(guān)系,關(guān)注粉絲 強(qiáng)好友關(guān)系:qq,正常數(shù)據(jù)庫中寫一條就可以了,但是查詢的時(shí)候很麻

    2024年02月12日
    瀏覽(21)
  • 即時(shí)通訊系統(tǒng)為什么選擇GaussDB(for Redis)?

    摘要:如果你需要一款穩(wěn)定可靠的高性能企業(yè)級(jí)KV數(shù)據(jù)庫,不妨試試GaussDB(for Redis)。 每當(dāng)網(wǎng)絡(luò)上爆出熱點(diǎn)新聞,混跡于各個(gè)社交媒體的小伙伴們?nèi)奸_啟了討論模式。一條消息的產(chǎn)生是如何在群聊中傳遞的呢?讓我們一起來探索即時(shí)通訊系統(tǒng)(IM)的原理。 當(dāng)你在群聊“相親相

    2023年04月21日
    瀏覽(17)
  • 即時(shí)通訊獨(dú)立系統(tǒng)源碼包含Android 、iOS、PC

    即時(shí)通訊獨(dú)立系統(tǒng)源碼包含Android 、iOS、PC

    demo軟件園每日更新資源,請(qǐng)看到最后就能獲取你想要的: 1.經(jīng)典版哇呼星聊即時(shí)通訊獨(dú)立系統(tǒng)源碼?包含Android?、iOS、PC?自帶教程 哇呼星聊即時(shí)通訊系統(tǒng)源碼?Android+iOS+PC三端 附教程 服務(wù)器最低配置4H4G?這套安裝跟shiku一樣 1.安裝寶塔,只安裝Nginx,其他不用安裝,不用創(chuàng)建站

    2024年02月01日
    瀏覽(24)
  • 聊天室即時(shí)通訊系統(tǒng)源碼 類似微信的H5聊天系統(tǒng)APP源碼 ThinkPHP內(nèi)核

    聊天室即時(shí)通訊系統(tǒng)源碼 類似微信的H5聊天系統(tǒng)APP源碼 ThinkPHP內(nèi)核

    前端: 用Dcloud 的 uni-app全系,基于vue.js和微信小程序開發(fā)模式。 目前支持APP(android、ios)、H5、微信小程序、支付寶小程序5端。 在特定場(chǎng)景可以用weex進(jìn)行原生渲染。 APP用的是Dcloud 公司的H5+進(jìn)行原生接口調(diào)用。 后端: php 7.2.x Thinkphp 5.1作HTTP服務(wù)(nginx)。 getWanWork作socket服務(wù)

    2024年02月08日
    瀏覽(26)
  • 聊天、會(huì)議、多媒體一體化:多平臺(tái)支持的即時(shí)通訊系統(tǒng) | 開源日?qǐng)?bào) No.44

    聊天、會(huì)議、多媒體一體化:多平臺(tái)支持的即時(shí)通訊系統(tǒng) | 開源日?qǐng)?bào) No.44

    Stars: 28.2k License: Apache-2.0 Gitness 是一個(gè)建立在 Drone 之上的新型開源開發(fā)者平臺(tái),具備代碼托管和流水線功能。它提供了以下核心優(yōu)勢(shì): 輕量級(jí)、超快速的代碼托管和持續(xù)集成服務(wù) 支持 Docker 容器化部署 可以在本地環(huán)境中構(gòu)建和運(yùn)行系統(tǒng),無需依賴 Docker 容器 提供完整的用戶

    2024年02月07日
    瀏覽(67)
  • 開源im聊天系統(tǒng)源碼全套+php即時(shí)通訊源碼帶直播紅包系統(tǒng)(uniapp/pc/app/h5四端)

    開源im聊天系統(tǒng)源碼全套+php即時(shí)通訊源碼帶直播紅包系統(tǒng)(uniapp/pc/app/h5四端)

    隨著移動(dòng)互聯(lián)網(wǎng)的迅猛發(fā)展,即時(shí)通訊(Instant Messaging,簡(jiǎn)稱IM)已經(jīng)成為現(xiàn)代社交生活中不可或缺的一部分。無論是個(gè)人還是企業(yè),都需要一種高效、安全、穩(wěn)定的即時(shí)通訊方式來滿足實(shí)時(shí)溝通的需求。因此,IM源碼的開發(fā)變得越來越重要,它為我們提供了構(gòu)建現(xiàn)代化即時(shí)通

    2024年02月03日
    瀏覽(31)
  • uniapp即時(shí)通訊源碼/im聊天系統(tǒng)源碼開源(app+h5+小程序+pc四端)

    uniapp即時(shí)通訊源碼/im聊天系統(tǒng)源碼開源(app+h5+小程序+pc四端)

    IM即時(shí)通訊源碼是現(xiàn)今互聯(lián)網(wǎng)行業(yè)中成熟、穩(wěn)定和高效的即時(shí)通訊解決方案之一,其源碼可以提供給開發(fā)者進(jìn)行二次開發(fā)和定制化,實(shí)現(xiàn)更加個(gè)性化的即時(shí)通訊功能。本文將圍繞IM即時(shí)通訊源碼進(jìn)行深入探討,包括其優(yōu)勢(shì)、應(yīng)用場(chǎng)景以及二次開發(fā)和定制化等方面的內(nèi)容。 源碼

    2024年02月04日
    瀏覽(23)
  • 自己手寫了一套高性能分布式IM即時(shí)通訊系統(tǒng),出去面試嘎嘎聊,都把面試官整不會(huì)了!

    自己手寫了一套高性能分布式IM即時(shí)通訊系統(tǒng),出去面試嘎嘎聊,都把面試官整不會(huì)了!

    沉淀,成長(zhǎng),突破,幫助他人,成就自我。 大家好,我是冰河~~ 分布式IM即時(shí)通訊系統(tǒng)本質(zhì)上就是對(duì)線上聊天和用戶的管理,針對(duì)聊天本身來說,最核心的需求就是: 發(fā)送文字、圖片、文件、語音、視頻、消息緩存、消息存儲(chǔ)、消息未讀、已讀、撤回,離線消息、歷史消息、

    2024年01月24日
    瀏覽(29)
  • PHP脈聊交友系統(tǒng)網(wǎng)站源碼,可通過廣告變現(xiàn)社交在線聊天交友即時(shí)通訊APP源碼,附帶視頻搭建教程

    PHP脈聊交友系統(tǒng)網(wǎng)站源碼,可通過廣告變現(xiàn)社交在線聊天交友即時(shí)通訊APP源碼,附帶視頻搭建教程

    探索全新社交體驗(yàn):一站式PHP交友網(wǎng)站解決方案 ??? 全球化交友,無界溝通 在數(shù)字化的浪潮下,社交已不再受地域限制。我們的PHP交友網(wǎng)站不僅支持多國(guó)語言,還配備了即時(shí)翻譯功能,讓您輕松跨越語言障礙,與全球各地的朋友暢聊無阻。 ??? 即時(shí)通訊,溝通無延遲 無論

    2024年02月21日
    瀏覽(25)
  • Python 基于列表實(shí)現(xiàn)的通訊錄管理系統(tǒng)(有完整源碼)

    Python 基于列表實(shí)現(xiàn)的通訊錄管理系統(tǒng)(有完整源碼)

    目錄 通訊錄管理系統(tǒng) PersonInformation類 ContactList類 menu函數(shù) main函數(shù) 程序的運(yùn)行流程 完整代碼 運(yùn)行示例 這是一個(gè)基于文本的界面程序,用戶可以通過命令行與之交互,它使用了CSV文件來存儲(chǔ)和讀取聯(lián)系人信息,這使得數(shù)據(jù)可以持久化保存。此外,程序還提供了一些基本的輸入

    2024年04月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包