亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Linux的即時通信系統(tǒng)設(shè)計

        2020-09-14 10:27:56涂笑語王美玉朱友華
        實驗室研究與探索 2020年8期
        關(guān)鍵詞:數(shù)據(jù)庫用戶

        涂笑語, 王美玉, 李 毅, 朱友華

        (南通大學(xué)信息科學(xué)技術(shù)學(xué)院,江蘇南通226019)

        0 引 言

        Linux系統(tǒng)作為自由、開源的類Unix 操作系統(tǒng),廣泛應(yīng)用于個人計算機、服務(wù)器以及各種嵌入式終端設(shè)備。它的優(yōu)勢在于具有開放性、多用戶、多任務(wù)、豐富的網(wǎng)絡(luò)功能、可靠的系統(tǒng)安全等。用戶可以對加入革奴計劃(GNU’s Not Unix,GNU)的軟件進行任意使用或者修改源代碼。目前,國內(nèi)外有各式各樣界面友好、功能齊全的即時通信軟件,但是它們都是基于Windows、Android和iOS系統(tǒng),或者只是功能較局限的Linux版本,且不是開源的。另外,不同商業(yè)軟件使用各自自有的即時通信協(xié)議,互相之間無法通信,這也不利于即時通信軟件的發(fā)展。設(shè)計一個基于Linux 的開源即時通信系統(tǒng)十分有必要。

        1 即時通信系統(tǒng)的基礎(chǔ)理論

        1.1 TCP協(xié)議

        傳輸控制協(xié)議(Transmission Control Protocol,TCP)的特點是面向連接且相對可靠[1]。通過該協(xié)議傳輸數(shù)據(jù)時,首先要進行3 次握手來建立服務(wù)器與客戶端之間的連接;為保證數(shù)據(jù)完整性和準確性,如數(shù)據(jù)驗證結(jié)果與原來不符,則需要重傳數(shù)據(jù);若數(shù)據(jù)傳輸順利完成,則需通過4 次揮手來關(guān)閉連接[2]。TCP 適用于傳輸大量數(shù)據(jù)且對可靠性要求較高的情況,其缺點是開銷較大、速度較慢[3]。

        1.2 C/ S架構(gòu)

        本設(shè)計采用基于TCP 的C / S 架構(gòu)[4]。C / S 架構(gòu)模式是非對稱的,核心是數(shù)據(jù)庫服務(wù)[5]。它將連接在網(wǎng)絡(luò)中的多臺終端組成一個整體,客戶端和服務(wù)器分別負責(zé)完成不同的功能。服務(wù)器用來響應(yīng)客戶端的請求,針對不同的請求類型為其提供對應(yīng)的服務(wù);客戶端根據(jù)自己的需求,向服務(wù)器發(fā)出不同的請求[6]。用戶A、B之間的信息傳輸通過服務(wù)器進行中轉(zhuǎn)。C / S架構(gòu)的基本工作原理如圖1 所示。

        圖1 C/ S架構(gòu)基本工作原理

        2 即時通信系統(tǒng)的設(shè)計

        2.1 設(shè)計思路

        目前市面上常見的即時通信軟件設(shè)計思路大致如圖2 所示[7]。首先打開應(yīng)用程序,顯示主界面,一般都會有注冊賬戶、登錄和退出這3 個基本功能。注冊時,無論成功與否,系統(tǒng)均會有提示。登錄時,如果用戶名和密碼匹配且正確,則可以成功登錄。登錄成功后,系統(tǒng)會根據(jù)不同的用戶身份顯示對應(yīng)的功能界面。在本系統(tǒng)設(shè)計中,管理員用戶有獨享功能。

        圖2 設(shè)計思路

        2.2 數(shù)據(jù)庫的設(shè)計

        在服務(wù)器模塊中需要使用數(shù)據(jù)庫來存放用戶注冊的用戶名、密碼以及聊天記錄。系統(tǒng)設(shè)計過程中,使用SQLite的編程接口函數(shù)來實現(xiàn)創(chuàng)建表、添加數(shù)據(jù)、更新數(shù)據(jù)和查詢數(shù)據(jù)這4 個操作[8]。數(shù)據(jù)庫打開函數(shù)要和關(guān)閉函數(shù)成對使用,因為如果數(shù)據(jù)庫沒有關(guān)閉,則其他程序無法使用該數(shù)據(jù)庫。而且數(shù)據(jù)庫的連接數(shù)有上限,如果有足夠數(shù)量的程序在關(guān)閉之前沒有關(guān)閉數(shù)據(jù)庫,則可能導(dǎo)致數(shù)據(jù)庫系統(tǒng)崩潰。

        本次設(shè)計需要創(chuàng)建的表名為user,有4 個字段,存放的數(shù)據(jù)均為TEXT類型。第1 個字段username存放用戶名,第2 個字段password 存放密碼,第3 個字段to_name存放發(fā)送信息時接收方的用戶名,第4 個字段record存放具體的聊天內(nèi)容。user 表的結(jié)構(gòu)如表1所示。

        表1 user表的結(jié)構(gòu)

        2.3 傳輸數(shù)據(jù)格式的設(shè)計

        在傳輸數(shù)據(jù)時,客戶端與服務(wù)器之間需要同時遵守一個協(xié)議來規(guī)范各個模塊之間的通信。本系統(tǒng)的設(shè)計中,定義了一個結(jié)構(gòu)體來規(guī)范通信時傳輸?shù)乃袛?shù)據(jù)類型。具體定義如下。

        struct msg

        int action;

        char name[30];

        char to_name[30];

        char from_name[30];

        char password[30];

        char message[1024];

        char online_name[30][30];

        int row;

        int column;

        char record[100][100];

        };

        對于上面的結(jié)構(gòu)體,action 中存放的是命令號,不同的命令號對應(yīng)不同的指令;char類型的name數(shù)組存放用戶名,限定長度為30;接下來分別是接收方用戶名、發(fā)送方用戶名、密碼和消息內(nèi)容;online_name 是一個二維數(shù)組,存放在線用戶名;最后3 個參數(shù)是消息記錄的行數(shù)、列數(shù)、具體消息記錄,這里限定最多查詢100 條消息記錄??蛻舳伺c服務(wù)器之間進行通信時,收發(fā)的信息均以結(jié)構(gòu)體的形式進行傳輸??蛻舳嘶蛘叻?wù)器收到該結(jié)構(gòu)體后按照具體功能需求獲取所需的數(shù)據(jù)。

        命令號action也需要客戶端和服務(wù)器采用同一種規(guī)范,雙方可以正確識別命令,然后去執(zhí)行對應(yīng)的函數(shù),實現(xiàn)相應(yīng)的功能。具體的命令號協(xié)議見表2。

        表2 命令號協(xié)議

        2.4 服務(wù)器的設(shè)計

        Linux系統(tǒng)中的網(wǎng)絡(luò)編程是通過socket 編程接口來實現(xiàn)的[9]。設(shè)計中采用了基于TCP 的流式套接字類型,使用socket庫中的sockaddr_in 數(shù)據(jù)結(jié)構(gòu)來存儲IP地址和端口號。編程過程中考慮到不同終端存儲數(shù)據(jù)時有大端模式和小端模式之分,還涉及到對網(wǎng)絡(luò)地址的字節(jié)序轉(zhuǎn)換?;赥CP 的C / S 架構(gòu)中服務(wù)器的搭建流程如圖3 所示[10-11]。

        圖3 服務(wù)器端的搭建流程

        服務(wù)器端需要先打開數(shù)據(jù)庫,然后按照流程搭建服務(wù)器。服務(wù)器端搭建流程中用到了兩種套接字,第一種是socket()函數(shù)新建的套接字,listen()函數(shù)用來監(jiān)聽該套接字;如果有客戶端請求連接,則新建一個通信套接字來專門用來處理與該客戶端的連接。需要注意的是,在執(zhí)行l(wèi)isten()函數(shù)之后要創(chuàng)建多線程,主線程負責(zé)監(jiān)聽客戶端的請求,每當(dāng)有一個客戶端請求連接就需要新建一個線程來專門處理與該客戶端的通信[12-13]。accept()函數(shù)是一個阻塞型函數(shù),如果沒有客戶端請求連接,則一直阻塞??蛻舳伺c服務(wù)器連接成功后,負責(zé)通信的線程會執(zhí)行receive_msg()函數(shù)。該函數(shù)內(nèi)部會用read()函數(shù)讀取命令代號,根據(jù)命令號分別執(zhí)行不同的函數(shù),實現(xiàn)不同的功能,將對應(yīng)的信息返回給目標客戶端。服務(wù)器端的執(zhí)行流程如圖4所示。

        圖4 服務(wù)器端的執(zhí)行流程

        (1)注冊reg()。收到注冊請求后,先在數(shù)據(jù)庫中查找想要注冊的用戶名,如果該用戶名未被注冊,則將用戶名和密碼插入數(shù)據(jù)庫中,返回注冊成功代號;如果用戶名已被注冊,則返回錯誤號。

        (2)登錄log_in()。收到登錄請求后,檢查該用戶是否已登錄、是否已在線、用戶名和密碼是否匹配,檢查用戶身份,向客戶端返回身份代號,將該用戶插入在線用戶列表。

        (3)群聊chat-all()。將用戶想要發(fā)送的信息保存到數(shù)據(jù)庫的聊天記錄字段,給當(dāng)前所有在線用戶發(fā)送該信息。

        (4)私聊chat_ private()。檢查目標用戶是否存在、是否在線,如果在線,保存聊天記錄,向該用戶發(fā)送信息。

        (5)修改密碼modify_password()。使用update命令在數(shù)據(jù)庫中將當(dāng)前用戶的password字段更新為想要修改的密碼。

        (6)查看聊天記錄chat_record()。使用select命令去數(shù)據(jù)庫中查詢記錄,只要username 或者to_name中有任意一個字段與當(dāng)前用戶名匹配,即為當(dāng)前用戶的聊天記錄,將其返回客戶端即可。

        (7)踢人kick_out()。檢查目標用戶是否存在、是否在線,如果在線,將其通信套接字置零并移出在線列表。

        (8)禁言與解禁banned()/ unbanned()。該功能主要在客戶端實現(xiàn),服務(wù)器只需返回標志位。

        2.5 客戶端的設(shè)計

        此外,C / S架構(gòu)中客戶端的搭建流程如圖5 所示。

        圖5 客戶端的搭建流程

        客戶端運行之后會顯示主頁面,可以選擇注冊、登錄或者退出,系統(tǒng)會根據(jù)輸入的命令號的不同對應(yīng)執(zhí)行不同的函數(shù)。如果注冊成功,則系統(tǒng)會在服務(wù)器端的數(shù)據(jù)庫中添加用戶名、密碼等相關(guān)信息。如果用戶登錄時輸入的用戶名和密碼均存在且與服務(wù)器端的數(shù)據(jù)庫匹配,則可以登錄成功。登錄成功之后,客戶端會利用多線程技術(shù)進行讀寫分離,即主線程函數(shù)根據(jù)用戶身份顯示對應(yīng)功能界面,根據(jù)用戶輸入的命令專門負責(zé)向服務(wù)器發(fā)送消息,新建線程專門負責(zé)從服務(wù)器接收消息,根據(jù)服務(wù)器返回的命令號去解析消息結(jié)構(gòu)體,從中獲取所需的數(shù)據(jù),顯示該命令對應(yīng)功能所需的信息。客戶端的執(zhí)行流程如圖6 所示。

        (1)注冊reg()。從鍵盤讀取用戶輸入的用戶名和密碼,如果符合要求,則發(fā)送給服務(wù)器,等待服務(wù)器返回注冊狀態(tài)。

        (2)登錄log_in()。輸入用戶名和密碼,發(fā)送給服務(wù)器,等待服務(wù)器返回登錄狀態(tài)。

        (3)向服務(wù)器發(fā)消息write_to_server()。主線程負責(zé)執(zhí)行該函數(shù),根據(jù)不同用戶身份,系統(tǒng)顯示不同的功能界面。對于普通用戶,主要功能有:查看在線用戶、群聊、私聊、修改密碼、查看聊天記錄和退出登錄。對于管理員用戶,新增了踢人、禁言和解禁的功能。用戶輸入不同的命令號,執(zhí)行相應(yīng)的函數(shù)。

        圖6 客戶端的執(zhí)行流程

        (4)從服務(wù)器讀消息read_from_server()。新建的線程負責(zé)執(zhí)行該函數(shù),根據(jù)從服務(wù)器端返回的命令號的不同,解析消息結(jié)構(gòu)體中的數(shù)據(jù)并顯示出對應(yīng)的提示信息。如客戶端收到的是群聊或者私聊命令,顯示消息結(jié)構(gòu)體中的文本信息并提示用戶消息類型。如客戶端收到的是踢人命令,表示當(dāng)前登錄的用戶被管理員踢出聊天室,調(diào)用函數(shù)退出程序。禁言和解禁功能主要在客戶端的代碼中實現(xiàn),首先定義一個全局變量flag作為標志位,默認為“0”,表示未被禁言。當(dāng)客戶端收到禁言命令時,將flag 置為“1”,表示當(dāng)前用戶被禁言。此外,還要在write_to_server()函數(shù)中設(shè)置條件,發(fā)送群聊和私聊請求時如遇到flag 為“1”就不會向服務(wù)器發(fā)消息,在用戶界面提示已被禁言,這樣就實現(xiàn)了禁言功能。解禁功能編程思路與禁言一致,只需要將標志位flag重新置為“0”[14]。

        3 結(jié) 語

        本實驗設(shè)計了一個基于Linux 平臺的即時通信系統(tǒng),實現(xiàn)了注冊、登錄、查看聊天記錄、群聊、私聊、修改密碼、查看聊天記錄等基本功能,新增管理員用戶獨享踢人、禁言和解禁功能。經(jīng)過測試,系統(tǒng)實現(xiàn)了預(yù)期的功能,滿足通信需求,而且系統(tǒng)運行穩(wěn)定,具有一定的實用性。同時還可對系統(tǒng)進行圖形化界面設(shè)計、引入數(shù)據(jù)傳輸?shù)募用芩惴ê蛯崿F(xiàn)與外部網(wǎng)絡(luò)的連接等進一步優(yōu)化操作[15-16]。

        猜你喜歡
        數(shù)據(jù)庫用戶
        數(shù)據(jù)庫
        財經(jīng)(2017年15期)2017-07-03 22:40:49
        數(shù)據(jù)庫
        財經(jīng)(2017年2期)2017-03-10 14:35:35
        關(guān)注用戶
        商用汽車(2016年11期)2016-12-19 01:20:16
        關(guān)注用戶
        商用汽車(2016年6期)2016-06-29 09:18:54
        數(shù)據(jù)庫
        財經(jīng)(2016年15期)2016-06-03 07:38:02
        關(guān)注用戶
        商用汽車(2016年4期)2016-05-09 01:23:12
        數(shù)據(jù)庫
        財經(jīng)(2016年3期)2016-03-07 07:44:46
        數(shù)據(jù)庫
        財經(jīng)(2016年6期)2016-02-24 07:41:51
        Camera360:拍出5億用戶
        100萬用戶
        男女主共患难日久生情的古言| 国产亚洲欧美日韩综合综合二区| 91精品啪在线看国产网站| 国产又色又爽的视频在线观看91 | 国产精品高清网站| 欧美性受xxxx白人性爽| 国产精品无码片在线观看| 中文字幕日本韩国精品免费观看| 虎白女粉嫩粉嫩的18在线观看| 激情综合色综合久久综合| 日韩国产一区| 精品少妇白浆一二三区| 操风骚人妻沉沦中文字幕| 国产97在线 | 亚洲| 久久狠狠高潮亚洲精品暴力打| 国产三级精品三级在线| 一本色综合网久久| 男人扒开女人下面狂躁小视频| 欧美日本免费一区二| 亚洲国产女同在线观看| 国产成人亚洲综合| 久久久精品2019免费观看| 国产码欧美日韩高清综合一区| 人妻蜜桃日产一本久道综合在线| 18禁黄污吃奶免费看网站| 久久国产精品无码一区二区三区| 女同另类激情在线三区| 国语淫秽一区二区三区四区| 丰满人妻一区二区三区视频53| 午夜一级在线| 日本高清一区二区三区不卡 | 日韩中文字幕免费视频| 午夜免费福利在线观看| 国产色婷亚洲99精品av网站| 无码日韩精品一区二区免费暖暖| 理论片87福利理论电影| 无码无在线观看| 国产亚洲精品97在线视频一| a级国产乱理伦片| 欧美老妇牲交videos| 中国人妻被两个老外三p|