国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Java語言的即時(shí)通訊系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

2022-05-30 10:48:04杜瑞慶李一諾
電腦知識與技術(shù) 2022年31期
關(guān)鍵詞:多線程

杜瑞慶 李一諾

摘要:即時(shí)通訊系統(tǒng)在日常工作與生活中有著不可或缺的作用。文中對當(dāng)下即時(shí)通訊軟件的現(xiàn)狀與痛點(diǎn)進(jìn)行了分析,并基于此設(shè)計(jì)一款輕量化的即時(shí)通訊系統(tǒng)。文章使用Java語言,基于C/S架構(gòu)來探究并進(jìn)行系統(tǒng)開發(fā),用巧妙的方法使系統(tǒng)突破了局域網(wǎng)的限制,通過系統(tǒng)的客戶端、服務(wù)端、數(shù)據(jù)庫對其設(shè)計(jì)進(jìn)行了介紹,并詳細(xì)闡述了系統(tǒng)的功能和實(shí)現(xiàn)步驟。

關(guān)鍵詞:即時(shí)通訊系統(tǒng);Socket;Java;文件發(fā)送;多線程;C/S

中圖分類號:TP311 ? ? ?文獻(xiàn)標(biāo)識碼:A

文章編號:1009-3044(2022)31-0029-04

1 引言

QQ、微信等即時(shí)通訊應(yīng)用,早已成為了人們生活中不可或缺的部分。但歷經(jīng)幾年的開發(fā),其內(nèi)容由于更新趨于臃腫,存儲空間耗費(fèi)也隨著增加,且數(shù)據(jù)傳遞的穩(wěn)定性也未能獲得顯著的提高,因而該類應(yīng)用對于要求精簡和安全的用戶并不合適。

論文使用Java語言實(shí)現(xiàn)一款輕量化的即時(shí)通訊系統(tǒng)。其在保證用戶基本操作的基礎(chǔ)上,摒棄了當(dāng)今即時(shí)通訊軟件大部分過于臃腫的功能。信息在傳輸過程中會被全程加密,保證用戶在溝通時(shí)的信息安全。并且基于Java語言健壯、安全、跨平臺的特性,用戶可以在任意操作系統(tǒng)上運(yùn)行此系統(tǒng)的同時(shí),防范各種攻擊[1]。這些都對用戶協(xié)同效率的提升有著重要的作用。

2 系統(tǒng)需求

設(shè)計(jì)一個(gè)即時(shí)通訊軟件系統(tǒng),要求每個(gè)用戶有獨(dú)立的客戶端。

1) 客戶端需要登錄才可以進(jìn)入,并帶有注冊頁面。登錄和注冊頁面需帶有判斷輸入合法性的功能。

2) 用戶可以通過客戶端發(fā)送文本,上傳文件。且接收者會實(shí)時(shí)收到消息。

3)用戶可以查看消息記錄,并可以下載消息記錄中的文件。

3 系統(tǒng)設(shè)計(jì)

3.1 系統(tǒng)架構(gòu)

程序?yàn)?C/S 架構(gòu)。客戶端負(fù)責(zé)信息的顯示、與服務(wù)端進(jìn)行消息的收發(fā)操作。服務(wù)端負(fù)責(zé)信息的收集、存儲、處理、發(fā)送。

3.2 客戶端設(shè)計(jì)

1) 登錄與注冊:系統(tǒng)可以判斷輸入是否為空、輸入是否合法。對于登錄功能,系統(tǒng)還可以判斷賬號是否存在、密碼是否正確;對于注冊功能,系統(tǒng)還可以判斷賬號或用戶名是否重復(fù)、兩次密碼是否一致。任何錯(cuò)誤導(dǎo)致無法登錄或注冊,系統(tǒng)都會清空一些已經(jīng)輸入的信息。

2) 消息發(fā)送:用戶可以將文本寫入到輸入框中,點(diǎn)擊“發(fā)送”按鈕發(fā)送。也可以通過“選擇文件”按鈕發(fā)送文件。

3) 安全傳輸:信息在發(fā)送前會經(jīng)過特殊加密,直至目標(biāo)客戶端收到才會被解密。

4) 消息接收:客戶端的后臺可以實(shí)時(shí)接收由服務(wù)器發(fā)送的其他用戶的消息。

5) 消息顯示:客戶端可以在聊天框中實(shí)時(shí)顯示用戶本機(jī)發(fā)送的消息與其他用戶的消息。

6) 消息記錄查看:用戶可以查看到歷史的消息,即使此用戶之前為離線狀態(tài)。

7) 文件下載:如果消息是文件類型,用戶可以將其下載到本機(jī)的任何位置。

3.3 服務(wù)端設(shè)計(jì)

1) 登錄與注冊:可以判斷登錄與注冊中涉及數(shù)據(jù)庫的操作。如賬號是否存在,密碼是否錯(cuò)誤,用戶名是否已經(jīng)存在等。

2) 消息接收:實(shí)時(shí)接收任何客戶端發(fā)送的消息,并存儲到數(shù)據(jù)庫中。若此消息是文件,系統(tǒng)還會將文件儲存到服務(wù)器端,以供以后的下載操作。

3) 消息發(fā)送:處理收到的消息后,將消息轉(zhuǎn)發(fā)到所有其他的客戶端。

3.4 數(shù)據(jù)庫設(shè)計(jì)

1) 數(shù)據(jù)庫的概念結(jié)構(gòu)設(shè)計(jì)

數(shù)據(jù)庫的概念結(jié)構(gòu)設(shè)計(jì) ER 圖如圖1所示。

數(shù)據(jù)庫的設(shè)計(jì)滿足第三范式[2]。聊天平臺中可以有多個(gè)用戶,多條消息。每個(gè)用戶可以發(fā)送多條消息,一條消息只可以來自于一個(gè)用戶。

2) 數(shù)據(jù)庫的邏輯結(jié)構(gòu)設(shè)計(jì)

用戶(用戶編號,賬號,用戶名,密碼,地址,是否在線)。

消息(消息編號,消息內(nèi)容,消息類型,消息發(fā)送者id,消息接收者id,消息發(fā)送時(shí)間,文件路徑)。

3) 數(shù)據(jù)庫的表結(jié)構(gòu)設(shè)計(jì)

3.5 通訊模型

1) 登錄與注冊

在對用戶輸入的合法性進(jìn)行檢測后,客戶端會將注冊或登錄信息封裝為HTTP請求并發(fā)送至服務(wù)器端,服務(wù)器端會調(diào)用數(shù)據(jù)庫進(jìn)一步檢查數(shù)據(jù)的合法性。若數(shù)據(jù)合法,服務(wù)器會將數(shù)據(jù)存儲至數(shù)據(jù)庫,并將代表成功的響應(yīng)發(fā)送回客戶端。反之將代表失敗的響應(yīng)發(fā)送回客戶端??蛻舳烁鶕?jù)響應(yīng)的成功與否決定跳轉(zhuǎn)至下一步或者提醒用戶重新輸入。

2) 消息發(fā)送

服務(wù)器端在啟動(dòng)的同時(shí)會在特定端口創(chuàng)建一個(gè)ServerSocket來接收來自客戶端的承載著消息的Socket。用戶按下發(fā)送按鈕后,消息類型、消息內(nèi)容、發(fā)送時(shí)間、發(fā)送者和接收者等信息會被封裝并通過Socket發(fā)送至服務(wù)器。當(dāng)收到Socket消息后,服務(wù)器對不同類型的消息會做出不同的操作。若消息不包含文件,服務(wù)器會將消息內(nèi)容等信息存入數(shù)據(jù)庫。若消息包含文件,由于文件的內(nèi)容過大無法存入數(shù)據(jù)庫,服務(wù)器會將文件通過IO流存儲到服務(wù)器本地的磁盤,由文件的存儲路徑代替文件的內(nèi)容存入數(shù)據(jù)庫。之后如果有客戶端想獲取文件,服務(wù)器可以通過數(shù)據(jù)庫中的文件路徑找到文件。

3) 消息接收

Socket可以實(shí)現(xiàn)不同主機(jī)之間的數(shù)據(jù)傳輸,但這種數(shù)據(jù)傳輸一般只會在同一個(gè)域中發(fā)生。各種進(jìn)程使用這個(gè)相同的域互相之間用Internet協(xié)議簇來進(jìn)行通信[3]。用戶發(fā)送消息后需要服務(wù)器通知接收方,但由于客戶端一般與服務(wù)器處于不同域,若使用Socket,服務(wù)器想要訪問到客戶端難度非常大。比較理想的解決方案是客戶端主動(dòng)向處于公網(wǎng)的服務(wù)器端請求,以查詢是否有用戶向自己發(fā)送了消息。解決方案可以根據(jù)服務(wù)端響應(yīng)的時(shí)機(jī)不同分為兩種:

①短輪詢:客戶端每隔一秒向服務(wù)器端請求一次。無論是否有消息,服務(wù)端都會做出響應(yīng)??蛻舳烁鶕?jù)相應(yīng)的內(nèi)容判斷是否有新消息。

②長輪詢:客戶端向服務(wù)器請求,服務(wù)端會將請求掛起,直至有新消息才會響應(yīng)。客戶端不需要判斷是否有新消息。服務(wù)端響應(yīng)后,客戶端會立即再發(fā)送一次請求。

如果查詢到有用戶向自己發(fā)送了新消息,客戶端則根據(jù)消息類型的不同將消息打印至客戶端。由于請求過程需要線程掛起等待,故客戶端會專為消息的接收開辟一個(gè)新的線程。

4) 文件下載

文件下載請求的通訊模型較為簡單。由客戶端向服務(wù)端發(fā)送指定文件的下載請求,服務(wù)端收到請求后,會根據(jù)指定文件在數(shù)據(jù)庫存儲的文件路徑找到本地的文件,并將文件轉(zhuǎn)化為二進(jìn)制流響應(yīng)給客戶端??蛻舳耸盏胶髸⒍M(jìn)制流轉(zhuǎn)化為文件存儲到用戶指定的位置。

4 系統(tǒng)實(shí)現(xiàn)

4.1 登錄與注冊判斷

登錄與注冊判斷會分兩步,第一步是由本地客戶端判斷的格式錯(cuò)誤(輸入為空、輸入不合法)和服務(wù)器需要調(diào)用數(shù)據(jù)庫判斷的錯(cuò)誤(登錄時(shí)賬號不存在、注冊時(shí)用戶名重復(fù)等)。只有這兩步都未出現(xiàn)錯(cuò)誤,登錄才可以成功。

在用戶點(diǎn)擊登錄或注冊按鈕時(shí),客戶端會掃描所有輸入框體的內(nèi)容,如果發(fā)現(xiàn)空值,則向用戶提示錯(cuò)誤。如果輸入不為空,則繼續(xù)判斷輸入是否合法。如賬號密碼只能由字母與數(shù)字組成,若輸入不符合這一規(guī)定,則向用戶提示錯(cuò)誤。如果未發(fā)現(xiàn)格式錯(cuò)誤,系統(tǒng)會使用Http請求將用戶輸入的信息發(fā)送至服務(wù)器繼續(xù)判斷。

服務(wù)器收到用戶輸入的信息后會結(jié)合數(shù)據(jù)庫進(jìn)行判斷,并將成功與否返回至客戶端。

4.2 信息的發(fā)送與接收

客戶端向服務(wù)器發(fā)送數(shù)據(jù)時(shí)會根據(jù)信息類型的不同對信息做不同的封裝。服務(wù)器端會收集到客戶端的四種消息,格式為字符串,表示如下:

文本消息:text&發(fā)送者id&發(fā)送時(shí)間&接收者id&消息內(nèi)容

文件消息:file&發(fā)送者id&發(fā)送時(shí)間&接收者id&文件名稱&文件二進(jìn)制編碼

下載請求:download&此文件的發(fā)送者&發(fā)送時(shí)間&請求者id

歷史記錄請求:history&請求者id&目標(biāo)用戶id

服務(wù)端收到消息后會根據(jù)第一個(gè)“&”前的類型對消息做出不同的處理。

1) 文本消息

服務(wù)端通過類型text判斷消息類型為文本。文本消息首先會被打印到發(fā)送者的客戶端中,然后才會被發(fā)送至服務(wù)端。服務(wù)端處理完畢之后,會將信息存入到數(shù)據(jù)庫,之后若接收者的客戶端請求消息,服務(wù)端會從數(shù)據(jù)庫中查詢出消息并打包發(fā)送??蛻舳耸盏较⒑髸⑵浯蛴≈量蛻舳?。

2) 文件消息

服務(wù)端通過類型file判斷消息類型為文件。文件消息首先會被打印到發(fā)送者到客戶端中。文件消息中包含文件名稱和文件的二進(jìn)制編碼,服務(wù)端會在本地使用 IO 流創(chuàng)建文件并將文件的二進(jìn)制編碼輸入實(shí)現(xiàn)文件的上傳,最后將文件路徑存儲到數(shù)據(jù)庫以便之后的下載操作。存儲過后服務(wù)端同樣會在接收者客戶端請求時(shí)將消息打包發(fā)送。

3) 下載請求

用戶點(diǎn)擊文件消息中到“下載按鈕”時(shí),客戶端會讓用戶選擇文件保存路徑。 選擇完畢后,客戶端會向服務(wù)器端發(fā)送download開頭的下載請求。服務(wù)端會根據(jù)請求中包含的發(fā)送者的用戶id和發(fā)送時(shí)間在數(shù)據(jù)庫中查詢出相應(yīng)文件在服務(wù)器端的路徑。找到后會將文件名和二進(jìn)制編碼發(fā)送給客戶端,客戶端收到數(shù)據(jù)后會使用 IO 流將文件保存到用戶所選的路徑中。

4) 消息記錄查看

用戶點(diǎn)擊“歷史記錄”按鈕時(shí),會向服務(wù)器發(fā)送history開頭的歷史記錄請求。服務(wù)端會查詢數(shù)據(jù)庫,將請求者和目標(biāo)用戶之間的消息全部發(fā)送。客戶端處理消息后,打印至客戶端的消息記錄面板。

4.3 信息加密

在客戶端和服務(wù)端的通訊過程中,凡是消息內(nèi)容,客戶端都會對其加密,直至傳送到另一個(gè)客戶端才會對消息進(jìn)行解密并顯示。系統(tǒng)的加密算法是基于Base64編碼并融合字符串隨機(jī)偏移形成的全新算法,此算法可以保證用戶的數(shù)據(jù)不會泄露。

1) Base64編碼

Socket有一個(gè)致命的缺陷,其不能傳輸漢字。想要實(shí)現(xiàn)漢字的傳輸,就要將字符串重新編碼。Base64是現(xiàn)今最常用的編碼方式之一,它可以將人們發(fā)送的信息進(jìn)行特殊計(jì)算,生成一句由64個(gè)常見字符組成的字符串[4]。使用Base64編碼的目的是讓內(nèi)容可以通過Socket在各個(gè)網(wǎng)關(guān)之間進(jìn)行無錯(cuò)傳輸。Base64是可以編碼并解碼的,正因如此,它的作用主要在于數(shù)據(jù)的傳輸,而不是安全性。若想實(shí)現(xiàn)加密,需要配合字符串的變化。

2) 加密算法

Base64解碼器可以解密任何以Base64加密過的字符串。但如果此字符串發(fā)生了任何微小的改變,解密結(jié)果就會大相徑庭。利用此性質(zhì),客戶端會對原信息進(jìn)行1000次Base64加密。每兩次加密之間,客戶端會將字符串從中間進(jìn)行分割,然后將兩個(gè)字符串反轉(zhuǎn)后拼接,得到一個(gè)新的字符串供下一次加密。接收者的客戶端收到加密后的消息后,只需根據(jù)此算法進(jìn)行1000次Base64解密便可得到消息。在未知此加密算法的情況下,暴力破解無法得到正確的結(jié)果。

5 系統(tǒng)測試

即時(shí)通訊系統(tǒng)在開發(fā)完成后,需進(jìn)行系統(tǒng)測試,測試需要從需求符合度、功能正確性、性能指標(biāo)、運(yùn)行穩(wěn)定性、互聯(lián)互通、可用性、可維護(hù)性、兼容性等多個(gè)維度對本系統(tǒng)進(jìn)行整體測試,并得出測試結(jié)果[5]。

系統(tǒng)測試過程及結(jié)果。此系統(tǒng)使用Java語言,由idea工具編寫并對各個(gè)功能測試。1) 客戶端可以完成用戶的注冊和登錄。客戶端可以判斷輸入格式的正確性,服務(wù)器端可以判斷輸入的合法性;若出現(xiàn)注冊或登錄失敗,客戶端會生成彈窗提醒用戶。2) 用戶可以發(fā)送文本消息與文件消息,在一秒鐘之內(nèi)目標(biāo)用戶可以接收到此消息。3) 用戶可以下載收到的文件消息中附帶的文件,下載之后文件是完整無缺的。4) 用戶可以查看自己與任一用戶的聊天歷史。

6 結(jié)束語

本系統(tǒng)對當(dāng)今即時(shí)通訊軟件做了極致的精簡,保留了用戶最基本的功能。并且系統(tǒng)突破了局域網(wǎng)和系統(tǒng)的限制,使用戶可以隨時(shí)隨地進(jìn)行安全的信息交流和文件傳送。后期會將客戶端輪詢的信息請求方式升級為客戶端監(jiān)聽,這樣就會大大減少服務(wù)端的負(fù)載,使其可以承擔(dān)更多用戶的信息交流。

參考文獻(xiàn):

[1] Cay S.Horstmann.Java核心技術(shù)·卷 I(原書第10版)[M].周立新,譯.北京:機(jī)械工業(yè)出版社,2016.

[2] Forta B.MySQL必知必會[M].劉曉霞,鐘鳴,譯.北京:人民郵電出版社,2009.

[3] 劉惠欣,孟令一.C語言從入門到精通:全新精華版[M].北京:北京希望電子出版社,2017.

[4] 石春宏.基于base64編碼實(shí)現(xiàn)信息隱寫分析[J].信息與電腦(理論版),2020,32(1):118-119.

[5] 張烜,秦慶鵬.基于Java編程語言的內(nèi)網(wǎng)即時(shí)通訊插件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].中國新通信,2020,22(13):38-39.

【通聯(lián)編輯:謝媛媛】

收稿日期:2022-05-15

作者簡介:杜瑞慶(1974—) ,男,河北贊皇人,副教授,博士,主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用、數(shù)據(jù)庫應(yīng)用等;李一諾(2002—) ,男,山東濟(jì)南人,通信作者,本科在讀,研究方向?yàn)閷I(yè)軟件工程。

猜你喜歡
多線程
Java并發(fā)工具包對并發(fā)編程的優(yōu)化
基于多線程文件傳輸關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
網(wǎng)頁爬蟲技術(shù)的關(guān)鍵技術(shù)研究探索
一種基于多線程的高速磁盤鏡像算法
iOS并發(fā)程序設(shè)計(jì)中幾種方法的特點(diǎn)及使用技巧研究
電站鍋爐煤粉參數(shù)遠(yuǎn)程監(jiān)控系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn)
赞皇县| 兴安县| 堆龙德庆县| 湖州市| 富顺县| 西林县| 揭东县| 吉水县| 中阳县| 益阳市| 方正县| 东安县| 靖边县| 临江市| 石家庄市| 峨眉山市| 图木舒克市| 长垣县| 揭东县| 扶风县| 胶南市| 稻城县| 武威市| 女性| 通辽市| 大余县| 阿尔山市| 香河县| 芷江| 舟曲县| 宜城市| 七台河市| 堆龙德庆县| 玉林市| 沈阳市| 静宁县| 南汇区| 仙桃市| 大英县| 丹棱县| 大足县|