999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Unity3D的聊天室應用程序開發

2019-07-16 03:14:59郭驍陸海燕陶星州王浩
電腦知識與技術 2019年15期

郭驍 陸海燕 陶星州 王浩

摘要:針對典型聊天室開發中所涉及的服務端與客戶端程序設計、數據同步、客戶端UI設計、群組管理、掃碼進群方面的基本技術做了較為詳盡的介紹,詳細地分析了各個功能模塊的實現方法,提出了一系列在Unity3D開發客戶端程序的設計思路,為在Unity3D平臺實現網絡聊天功能提供了較為完整的解決方案,并以實例證明了該方案的可行性。

關鍵詞:Unity3D;聊天室;服務端;客戶端;掃碼進群;群組管理

中圖分類號:TP311 ? ?文獻標識碼:A

文章編號:1009-3044(2019)15-0073-03

Abstract: This paper introduces in detail the basic technologies of client and server programming, data synchronization, client UI design, group management, scanning and grouping involved in the development of typical chat rooms, analyses in detail the implementation methods of each functional module, and puts forward a series of design ideas for developing client program in Unity3D, in order to realize network chat on Unity3D platform. The sky function provides a more complete solution, and the feasibility of the solution is proved by an example.

Key words: U3D; chat room; server; client; sweep code into group; group management

1 背景

隨著網絡通信技術的迅猛發展,特別是微信、QQ和釘釘等社交軟件的應用普及,采用聊天室方式的信息溝通成為生活與工作中的重要需求。在各種實際工作場景中,聊天室這一用于實現消息通知、文件及音視頻傳輸的應用,已經成為一種基本功能。通常一個具體的網絡應用程序都擁有屬于自己的用戶群體,而聊天室正是用戶群體間信息交流中不可或缺的一部分。

Unity3D作為一款游戲引擎,正在越來越多地被應用于游戲之外的各種領域如建筑、汽車、醫學、教育等傳統行業;同時Unity3D也是VR技術發展中一股重要的力量,可以預見在不遠的將來,會出現各種具有聊天室功能并以Unity3D為平臺的網絡應用程序。本文采用面向客戶/服務器模型(Client/Server,C/S)設計的Socket技術[1],基于Unity3D平臺,探索典型聊天室開發的解決方案。本文開發環境采用Windows10操作平臺,MySQL5.6Server數據庫和Unity2018.3.10f1 (64-bit)個人版。

2 總體方案設計

2.1 需求分析

在本項目中,將基于Unity平臺實現網絡聊天室的基本功能,包括登錄、群聊、群組管理、掃碼進群等。

2.2 基本設計概念和處理流程

服務器首先將Socket初始化,綁定指定的端口,進行端口監聽,調用BeginAccept方法實現異步接收,等待客戶端連接,同時服務器連接到MySQL數據庫,讀取數據庫中信息,載入歷史配置。當有客戶端發出連接請求時,服務器將實例化一個Conn對象至連接池,并初始化Conn對象的Socket,如果連接成功,便可以在客戶端與服務端之間傳輸數據。服務端接收客戶端發送的數據請求并處理,處理結束后將處理結果發送給指定客戶端,該客戶端接收到服務端發來的數據,并利用該數據執行各種業務邏輯。當結束數據傳輸之后則關閉連接,客戶端與服務端不再進行交互。

該聊天室采用面向連接的傳輸控制協議,即TCP(Transmission Control Protocol),在傳輸數據之前必須先建立連接[2],完成數據輸出之后應釋放連接。服務器采用異步接收,可以并發處理多個用戶的連接請求,需要注意的是,每一次開辟新的線程來處理連接時,都需要向系統申請內存,隨著連接數的增加,系統內存損耗也會迅速上升,因此當客戶端不再傳輸數據時要及時銷毀線程,釋放內存。

3 服務端設計

在服務端程序中首先需要綁定一個固定端口并監聽來自客戶端的連接,同時連接到數據庫并同步歷史數據(如群組信息、資源文件路徑等),初始化連接池,等待接收來自客戶端的連接。

在客戶端發出連接請求時,服務端與該客戶端建立Socket連接,若連接成功,將在連接池中實例化Conn對象,同時開辟一個新的線程來處理服務端與該客戶端的連接。使用多線程的策略是因為服務端需要同時處理多個客戶端的連接[3-4],在實際應用場景中,在同一時刻往往會有大量客戶端訪問同一服務端,使用單線程逐個響應顯然在效率上是無法接受的。

在成功建立連接后,服務端將處理來自客戶端的各種請求,并在處理完成將結果回傳給客戶端,如果這些請求中包含了數據庫相關的操作,服務端將訪問啟動時連接的數據庫,對數據庫進行增、刪、改、查等操作。

3.1 綁定端口

實例化ServNet對象,并調用Start函數,在該函數中,將調用Bind方法綁定端口與具體的IP地址,在本地測試時將使用本機地址127.0.0.1,若需要在公網狀態下測試,需要重新配置Socket。在服務端程序中提供了手動配置的接口,測試人員可以通過命令行對正在運行的服務端程序進行重啟程序、重置端口等操作,便于在不同環境下的調試。

3.2 建立連接

在成功啟動服務器后,程序將自動調用BeginAccept方法,與發出連接請求的客戶端建立連接[5],如果出現連接失敗的情況,程序將拋出異常,并在連接池中銷毀錯誤的Conn對象。在BeginAccept方法中需要傳入一個回調函數,在該回調函數中將繼續調用BeginAccept方法,實現服務端不斷接收客戶端的連接請求,同時調用BeginReceive方法,不斷接收客戶端發送的信息。

3.3 響應處理

針對客戶端的各種數據請求,服務端將采取不同的處理策略,對于聊天內容,服務端首先將發送者ID、內容、所屬群組、發送時間等信息整合后存入數據庫作為聊天記錄,然后遍歷該消息所屬群組的成員,將消息廣播至所有群組成員所屬的客戶端。對于命令類的數據請求,如登錄賬號、創建群組、管理群組等,服務端首先判斷該命令是否有效,確認為合法命令后解析命令字段,獲取命令的具體類型,然后在ProcessData方法中使用分支結構,對不同命令進行相應的處理,然后將處理結果發回該客戶端,供客戶端執行后續的操作。

4 聊天室典型功能的實現

聊天室典型功能有登錄賬號、建立群組、群聊及群員管理等,下面介紹具體實現。

1)登錄功能的實現

系統將所有用戶的信息組織為一張表userdata,該表存放在與服務端相連的數據庫msgboard中。用戶輸入賬號與密碼后單擊Login按鈕,客戶端向服務器發出登錄請求,在收到登錄請求后,服務端將根據客戶端提供的賬號信息與數據庫中的信息進行驗證,并回傳驗證結果。驗證成功后,服務器會為發出請求的Conn對象初始化User信息(包括用戶名、權限等級等),將該用戶設置為在線狀態,從而實現用戶的登錄。

2)群聊功能的實現

群聊功能可以拆分為創建群組、發送信息、接收信息、消息提示幾個部分,下面將分別論述各部分功能的具體實現方法。

創建群組的實現。用戶在主界面中可以找到創建群組選項,輸入群組信息后單擊確認按鈕,客戶端將向服務端發出創建群組請求,服務端根據服務端發送的初始數據(群名、人數等)在數據庫msgboard中的表grouptable中添加記錄,同時生成一張與群組名對應的表,用于存放群聊記錄,從而完成新群組在數據庫的注冊。

發送信息的實現。客戶端通過交互界面獲取用戶將要發送的字符串消息,將字符串使用Base64碼制編碼后,利用Socket提供的異步發送方法BeginSend將字節流發送至服務器,這一過程將在客戶端開辟新的線程,從而避免系統阻塞。由于存在編碼后報文長度較長的情況,因此本項目中統一使用了分包的策略,當發送信息時,系統首先根據信息的長度將數據分為若干個數據包,并在包頭寫入包體長度等驗證信息,然后再發送給服務器。當服務器接收到所有的數據包后,將會根據包頭中附帶的長度信息檢驗包體的完整性,然后再發送給群組中的其他用戶。

接收信息的實現。由于客戶端與服務器均使用了分包發送策略,因此在客戶端實際接收到的數據也是多個數據包,這里同樣根據包頭附帶信息校驗完整性,并進行粘包操作,整合報文,然后對整合后的Base64編碼進行解碼操作得到常用的UTF-8編碼,最后在交互界面進行相應的顯示。

消息提示的實現。無論用戶是否正處在群聊界面,每當客戶端收到消息都會把消息實例化為MessageCache對象(MessageCache為本項目中用于描述消息屬性的類)并存儲在MessageCacheList中。如果用戶不在群聊界面,將提示用戶收到新消息(僅顯示數目),而當用戶正在群聊時,則會遍歷MessageCacheList,根據列表中每一個MessageCache對象中的數據逐條顯示消息內容。

3)掃碼進群聊功能的實現:

掃碼進群功能分為兩個基本步驟,即生成群組二維碼與解析群組二維碼。

群組二維碼的生成。本項目中使用了草料二維碼的開源庫ZXing.DLL,通過交互界面讀取用于生成二維碼的群組信息,然后調用ZXing自帶的Encode接口,即可得到相應的Texture2D對象,再將該Texture2D對象賦值給Unity原生的RawImage組件即可實現在屏幕上顯示二維碼。用戶也可以選擇單擊二維碼生成界面的Save按鈕將二維碼圖片保存至本地。

掃描二維碼。首先利用ZXing在BarcodeReader類中提供的讀取攝像頭內容的方法,將拍攝到的畫面實例化為RawImage對象,并在Update方法中根據攝像頭獲取的畫面持續更新RawImage對象,從而實現對畫面的實時捕捉。同時在Update方法中監聽BarcodeReader類提供的Decode方法,當該方法將攝像頭獲取到的畫面識別為有效二維碼時,二維碼解析成功,從屏幕捕捉到的二維碼將被轉換為普通的UTF-8字符串,客戶端解析字符串中所包含的群組信息后,向服務器發送加入群組請求,服務器收到請求后,將用戶信息插入群組對應的表中,完成用戶信息在數據庫的同步,從而實現掃碼進群。

5 客戶端設計

客戶端程序首先通過套接字連接到服務器IP地址(在本地測試中為本機IP地址,即127.0.0.1),默認端口3000。客戶端與服務端建立連接后,客戶端通過圖形交互界面獲取用戶輸入流,并向服務端發送信息,同時監聽服務器端口[6],以接收來自服務器的信息。客戶端的具體工作流程如下:在使用客戶端提供的各項功能之前,需要用戶輸入要進行連接的服務端IP與端口,當用戶單擊確認按鈕后,程序調用Connect方法與服務端建立連接,服務端才可以接收并處理客戶端發出的各項請求。

本項目中使用了Unity作為客戶端可視化圖形界面開發工具,與傳統的GUI開發工具(如MFC、QT等)不同,Unity作為一個游戲引擎,展示給用戶的是場景(Scene)而不是對話框(Dialog),因此在實際工程中,不同功能所對應的UI將被分別放在不同的場景中實現。

1)登錄界面。在Title4Android場景中,為用戶提供了四個Inputfile組件用于輸入服務器IP、Port以及用戶的賬號、密碼,并在登錄按鈕中綁定了Connect與Login方法,用于實現連接服務器、登錄賬號功能。

2)主界面。在MainUI4Android場景中,展示了用戶的個人信息以及當前加入的群組,其中群組信息通過一組GroupInfo預制體與其父物體上的GridGroup組件共同組成,每當用戶進入MainUIOnPC場景或單擊InitGroup按鈕來手動刷新群組信息時,客戶端都會向服務器發出查詢請求,通過服務器返回的查詢結果將各個群組的信息分別實例化為GroupInfo對象,并掛載在父物體Groups上,從而實現群組信息的列表化展示。

3)群聊界面。在ChatOnPC場景中,展示了用戶當前訪問的群組信息以及群組中各個成員發送的群聊消息。消息的列表化展示與群組信息類似,同樣使用了Prefab+GridGroup(即預制體+網格組)的策略[7],即先設計承載一條消息內容(包括發送者ID、消息內容)的預制體,然后將多個預制體實例化后依次掛載在GridGroup組件下。每當收到群員消息時,客戶端程序都會將收到報文解析為發送者信息與內容字段,并以此為參數實例化預制體對象,然后掛載到父物體,從而實現消息的動態顯示。

6 結束語

本項目結合Socket網絡通訊、MySQL數據庫技術,實現了數據信息在網絡中的傳輸,并基于Unity平臺實現了網絡聊天室的基本功能。程序中的各功能模塊之間較好地實現了松散耦合,因此本項目很容易單獨作為一個功能嵌入到其他Unity工程中。

(下轉第82頁)

(上接第75頁)

但由于服務器使用了多線程技術,系統會為每一個連接開辟新的線程[8],內存開銷較大,因此服務器的負載能力有限,同時由于程序本身機制所限,在同時處理大量連接以及傳輸數據包體過大時,系統的運行速度會明顯降低,還需要對系統性能做進一步的優化。

參考文獻:

[1] 陳潔, 孟曉景. 基于Socket接口的Linux與Windows網絡聊天室設計與實現[J]. 軟件導刊, 2015(6).

[2] 葛福鴻, 張麗萍. 基于Socket技術的聊天軟件設計與實現[J]. 電腦編程技巧與維護, 2012(5).

[3] 楊心強, 陳國有. 數據通信與計算機網絡[M]. 北京: 電子工業出版社, 2018(6).

[4] 常穎. 基于ASP網絡聊天室設計與實現[J]. 電子技術與軟件工程, 2017(3).

[5] 羅培羽. Unity3D網絡游戲實戰[M]. 北京: 機械工業出版社, 2015.

[6] 宋傳磊, 劉俊婷, 張光亮, 等. Unity3D項目腳本優化分析與研究[J]. 中國新通信, 2017(1).

[7] 宣雨松. Unity 3D游戲開發[M]. 北京: 人民郵電出版, 2012.

[8] 鄧亞君, 楊剛. 基于Python的網絡聊天室設計[J]. 電子技術與軟件工程, 2019(3).

【通聯編輯:謝媛媛】

主站蜘蛛池模板: 亚洲三级电影在线播放| 四虎亚洲精品| 欧美国产精品不卡在线观看| 亚洲欧美综合另类图片小说区| 亚洲欧洲自拍拍偷午夜色无码| 88国产经典欧美一区二区三区| 99re视频在线| 992tv国产人成在线观看| 人人妻人人澡人人爽欧美一区| 久久国语对白| 久久久久青草线综合超碰| 欧美在线视频a| 在线观看免费黄色网址| 色婷婷丁香| 国产亚洲男人的天堂在线观看| 色综合天天综合中文网| 久操线在视频在线观看| 不卡视频国产| 亚洲Av综合日韩精品久久久| 中文字幕欧美日韩| 激情综合五月网| 国产不卡在线看| 亚洲国产日韩视频观看| 亚洲视频色图| 国产激情在线视频| 色爽网免费视频| 2021国产精品自产拍在线| 熟女日韩精品2区| 欧美日韩一区二区在线播放| 国产不卡网| 欧美怡红院视频一区二区三区| 夜夜操天天摸| 国产成人亚洲无码淙合青草| 国产高清免费午夜在线视频| 精品伊人久久久香线蕉 | 欧美一级在线| …亚洲 欧洲 另类 春色| 黄色网站在线观看无码| 欧美国产日韩在线观看| 亚洲第一香蕉视频| 茄子视频毛片免费观看| Jizz国产色系免费| 女人av社区男人的天堂| 99热国产这里只有精品9九| 亚洲国产中文欧美在线人成大黄瓜 | 日本黄色不卡视频| 爆乳熟妇一区二区三区| 亚洲国产综合精品一区| 国产成人1024精品| 午夜毛片免费看| 国产91小视频| AV不卡国产在线观看| 一级毛片网| 国产波多野结衣中文在线播放| 无码专区国产精品一区| 国产成人精品一区二区免费看京| 丁香六月激情婷婷| 在线va视频| 亚洲最猛黑人xxxx黑人猛交| a毛片免费观看| 国产不卡网| 福利在线一区| 国产打屁股免费区网站| 亚洲无线国产观看| 九九视频在线免费观看| 丝袜国产一区| 九九久久99精品| 国产麻豆精品手机在线观看| 色综合婷婷| 青青网在线国产| 国产二级毛片| 欧美a网站| 97免费在线观看视频| 亚洲天堂精品视频| 伊人婷婷色香五月综合缴缴情| 亚洲第一综合天堂另类专| 2021国产精品自拍| 99久久精品久久久久久婷婷| 91丝袜乱伦| 免费看一级毛片波多结衣| 3D动漫精品啪啪一区二区下载| 激情国产精品一区|