通信軟件的設(shè)計與實現(xiàn)——畢業(yè)論文
《通信軟件的設(shè)計與實現(xiàn)——畢業(yè)論文》由會員分享,可在線閱讀,更多相關(guān)《通信軟件的設(shè)計與實現(xiàn)——畢業(yè)論文(32頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、畢業(yè)論文通信軟件的設(shè)計與實現(xiàn)論文作者姓名: 申請學(xué)位專業(yè): 申請學(xué)位類別: 指導(dǎo)教師姓名(職稱): 論文提交日期: 摘 要即時通信(Instant Message),由于其具有實時性、跨平臺性、成本低、效率高等優(yōu)點而受到廣泛的使用。設(shè)計并實現(xiàn)一個能夠處理多用戶進行實時、安全的即時通信系統(tǒng)具有較強的現(xiàn)實意義。即時通信的底層通信是通過SOCKET套接字接口實現(xiàn)的。當前的主流UNIX系統(tǒng)和微軟的WINDOWS系統(tǒng)都在內(nèi)核提供了對SOCKET字接口的支持。使用這個統(tǒng)一的接口,可以編寫一個可移植的TCP/IP通信程序。使信息能夠在INTERNET上可靠的傳輸。本文設(shè)計并實現(xiàn)了基于局域網(wǎng)內(nèi)的簡單即時通信系
2、統(tǒng),系統(tǒng)采用C/S模式,底層通信通過SOCKET套接字接口實現(xiàn),服務(wù)器負責(zé)客戶端的登錄驗證,好友信息的保存和心跳報文的發(fā)送。客戶端采用P2P方式實現(xiàn)消息傳遞,并能實現(xiàn)文件的傳輸。本文首先討論了同步套接字,異步套接字,多線程并發(fā)執(zhí)行任務(wù)等;然后闡述了客戶端、服務(wù)器如何使用XML序列化的消息進行通信。關(guān)鍵詞:即時通信;文件傳輸;套接字;TCP協(xié)議AbstractInstant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user
3、IM (instant message) architecture is very important in both theory and realism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsofts windows operation systems provide support of socket in the kernel. Using the uniform interfa
4、ce, we can develop a portable program of TCP/IP, which help us transfer information in Internet safely and credibly.The system uses the client/server(C/S) mode. The server takes the responsibility of the login message of client, the saving of friend message and Message heartbeat. The transmission of
5、 the basic messages of the customer end will be designed on P2P architecture. This thesis explains how the client and server communicate via serializing XML message.Key words: Instant Message; File Transfer; Socket; TCP protocol目 錄論文總頁數(shù):28頁1引言11.1課題背景11.2國內(nèi)外研究現(xiàn)狀11.2.1國外研究現(xiàn)狀11.2.2國內(nèi)研究現(xiàn)狀21.3本課題研究的意義21
6、.4本課題的研究方法22相關(guān)技術(shù)介紹22.1.NET開發(fā)平臺及C.NET開發(fā)語言22.2TCP協(xié)議32.2.1TCP/IP網(wǎng)絡(luò)協(xié)議32.2.2TCP傳輸控制協(xié)議32.3套接字42.4流42.4.1流的基本概念42.4.2.NET中的流42.5同步、異步、阻塞和非阻塞52.6C/S模型52.7即時通信協(xié)議63系統(tǒng)總體設(shè)計73.1需求分析73.2系統(tǒng)基本架構(gòu)73.3功能模塊設(shè)計73.4邏輯圖93.5數(shù)據(jù)庫設(shè)計103.5.1實體關(guān)系圖103.5.2詳細列表104系統(tǒng)實現(xiàn)114.1使用XML定義的即時通信協(xié)議114.1.1信息結(jié)構(gòu)MESSAGE.CS&UMESSAGE.CS114.1.2數(shù)據(jù)結(jié)構(gòu)Fri
7、endStruct124.2數(shù)據(jù)庫連接類144.3服務(wù)器端154.3.1同步套接字網(wǎng)絡(luò)監(jiān)聽154.3.2多線程194.3.3計時器194.4客戶端204.4.1同步套接字客戶端204.4.2采用異步套接字的文件傳輸23結(jié) 論25參考文獻26致 謝27聲 明281 引言1.1 課題背景即時通信是一個終端連往一個即時通信網(wǎng)路的服務(wù)。即時通信不同于e-mail在于它的交談是實時的。大部分的即時通信服務(wù)提供了presence awareness的特性顯示聯(lián)絡(luò)人名單,聯(lián)絡(luò)人是否在在線與能否與聯(lián)絡(luò)人交談。最早的即時通信軟件是ICQ,ICQ是英文中I seek you的諧音,意思是我找你。四名以色列青年于1
8、996年7月成立Mirabilis公司,并在11月份發(fā)布了最初的ICQ版本,在六個月內(nèi)有85萬用戶注冊使用。在因特網(wǎng)上受歡迎的即時通信服務(wù)包含了MSN Messenger、AOL Instant Messenger、Yahoo! Messenger、NET Messenger Service、Jabber、ICQ與QQ。 這些服務(wù)有賴于許多想法更久的(與普遍)的在線聊天媒介,如Internet Relay Chat一樣知名。1970年代早期,一種更早的即時通信形式是柏拉圖系統(tǒng)(PLATO system)。之后在1980年代,UNIX/Linux的交談實時信息被廣泛的使用于工程師與學(xué)術(shù)界,199
9、0年代即時通信更跨越了因特網(wǎng)交流。1996年11月,ICQ是首個廣泛被非UNIX/Linux使用者用于因特網(wǎng)的即時通信軟件。在ICQ的介紹之后,同時在許多地方有一定數(shù)量的即時通信方式發(fā)展,且各式的即時通信程序有獨立的協(xié)議,無法彼此互通。這引導(dǎo)使用者同時執(zhí)行兩個以上的即時通信軟件,或者他們可以使用支持多協(xié)議的終端軟件,如Gaim、Trillian或Jabber。近年來,許多即時通信服務(wù)開始提供視訊會議的功能,網(wǎng)絡(luò)電話(VoIP),與網(wǎng)絡(luò)會議服務(wù)開始整合為兼有影像會議與實時信息的功能。于是,這些媒體的分別變的越來越模糊。1.2 國內(nèi)外研究現(xiàn)狀1.2.1 國外研究現(xiàn)狀當今,國際上對網(wǎng)絡(luò)通信系統(tǒng)研究的
10、較好的公司有,思科,Sun,Ms等公司,思科主要研究的是底層的傳輸;MS,Sun公司研究的是應(yīng)用層。其中ms公司憑借其在操作系統(tǒng)的壟斷地位,為了在網(wǎng)絡(luò)的發(fā)展中取得先機,采用了各種各樣的手段。但是,其捆綁的msn,無論從功能上,還是技術(shù)上來說,都不算是非常先進的。當然,ie,同樣也不是很受人青睞,這讓人想起了,當年的網(wǎng)景公司,網(wǎng)景只是生不逢時。MS不擇手段的想打跨網(wǎng)景,可見其對網(wǎng)絡(luò)的重視。如今,Sun公司在網(wǎng)絡(luò)應(yīng)用上捷足先登,憑借著Java,Sun在網(wǎng)絡(luò)的應(yīng)用上領(lǐng)先于MS。微軟,想用同樣的辦法搞跨對手,因此它拿出了Visual c#,來對抗Java。這些都是在應(yīng)用層面的開發(fā)工具。應(yīng)用層上的產(chǎn)品就
11、更顯種類繁多。ICQ幾乎是國際上通用的即時通信工具,由于在我國它的應(yīng)用不是很廣,所以,其原理也很少被介紹。msn,是MS的產(chǎn)品,同樣在國內(nèi)沒什么市場,所以,對其原理,也很少被討論過。至于ie,是在Visual c+下開發(fā)的產(chǎn)品,雖然有嚴重的安全隱患,不過,至少能在某種程度上代表當今國際研究的水平。此外,國際上最近出先了新的瀏覽器Firefox,其性能據(jù)說是遠高于ie,也許在網(wǎng)絡(luò)的天下,Ms又有了更強勁的對手。1.2.2 國內(nèi)研究現(xiàn)狀國內(nèi)在應(yīng)用層上的網(wǎng)絡(luò)應(yīng)用軟件目前發(fā)展異常的火爆,因為我國有著網(wǎng)絡(luò)應(yīng)用的最大的市場,現(xiàn)在國內(nèi)網(wǎng)絡(luò)的基礎(chǔ)性建設(shè)發(fā)展迅速,應(yīng)用軟件也層出不窮,其中,在游戲的領(lǐng)域中,網(wǎng)絡(luò)通
12、信的工作做的不錯,如聯(lián)眾游戲平臺,還有其他的一些平臺,這些平臺基本上都是基于VC+的,用的都是Socket通信,但是為了效率,這些平臺沒有用MFC提供的CSocket類,而是直接用Socket進行通信。所以效率上不錯。此外,tencent的即時通信,也是做的很好的,從某中程度上來說,代表了國內(nèi)最高的水平。1.3 本課題研究的意義本課題目標是實現(xiàn)局域網(wǎng)用戶之間的即時交流和文件傳輸,通過基礎(chǔ)的網(wǎng)絡(luò)SOKET編程,為局域網(wǎng)內(nèi)部的即時通信提供一個簡單而較安全的解決方案。1.4 本課題的研究方法本系統(tǒng)采用C/S(Client/Server)結(jié)構(gòu)進行設(shè)計,使用SQL Server 2000構(gòu)建數(shù)據(jù)庫,并在
13、.NET環(huán)境下使用Visual C#.net語言和SOCKET套接字開發(fā)一個基于TCP協(xié)議的簡單即時通信軟件,實現(xiàn)簡單的即時聊天,文件傳輸?shù)裙δ堋? 相關(guān)技術(shù)介紹2.1 .NET開發(fā)平臺及C.NET開發(fā)語言.NET框架是Microsoft公司推出的一種全新的開發(fā)平臺,提供了統(tǒng)一的、面向?qū)ο蟛⑶铱梢詳U展的編程類庫和完善的集成開發(fā)環(huán)境,大大簡化了應(yīng)用程序的開發(fā)過程,并且具有良好的移植性和安全性。微軟為了推行.NET戰(zhàn)略,特別為.NET平臺設(shè)計了一種語言C#。C#是由C和C+派生而來的一種“簡單、流行、面向?qū)ο?、類型安全”的程序設(shè)計語言,其綜合了Visual basic的高效率和C+的強大功能,然而
14、更多的人感覺C#更類似JAVA。事實上C#融合了大量的JAVA思想,C#是.NET的關(guān)鍵性語言,它是整個.NET平臺的基礎(chǔ)。與C#相比,.NET所支持的其它語言顯然是配角,包括VC+.NET在內(nèi)。但是微軟并沒有打算放棄VC+.NET,相反,微軟對VC+.NET有著另一番獨特的打算,VC+.NET的定位與C#不完全重合,VC+.NET應(yīng)用范圍仍強于C#,這一點無論對微軟公司還是軟件業(yè)應(yīng)用現(xiàn)狀都非常重要??梢?.NET在NET框架中已經(jīng)退化成了底層的語言了,就像C+之前的標準C語言一樣,以后將只有開發(fā)底層或桌面程序的程序員使用它。它雖然仍舊強大,但是已經(jīng)不是主流,而主流就是C#語言。2.2 TCP
15、協(xié)議2.2.1 TCP/IP網(wǎng)絡(luò)協(xié)議協(xié)議是對等的網(wǎng)絡(luò)實體之間通信的規(guī)則,可以簡單地理解為網(wǎng)絡(luò)上各計算機彼此交流的一種“語言”。網(wǎng)絡(luò)通信協(xié)議設(shè)計的基本原則是層次化,層和協(xié)議的集合被稱為網(wǎng)絡(luò)體系結(jié)構(gòu)。相鄰層之間的接口定義了下層向上層提供的基本操作和服務(wù),下層向上層提供的服務(wù)分兩種形式:面向連接的服務(wù)和無連接的服務(wù)。計算機網(wǎng)絡(luò)中已經(jīng)形成的網(wǎng)絡(luò)體系結(jié)構(gòu)主要有兩個:OSI參考模型和TCP/IP參考模型。TCP/IP參考模型是因特網(wǎng)(Internet)的基礎(chǔ)。和OSI的7層協(xié)議相比,TCP/IP協(xié)議只有4個層次。通常說的TCP/IP是一組協(xié)議的總稱,TCP/IP實際上是一個協(xié)議族,包括100多個相互關(guān)聯(lián)的
16、協(xié)議,其中IP(Internet Protocol, 網(wǎng)際協(xié)議)是網(wǎng)絡(luò)層最主要的協(xié)議;TCP(Transmission Control Protocol,傳輸控制協(xié)議)和UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議是傳輸層中最主要的協(xié)議),一般認為IP、TCP、UDP是最根本的三種協(xié)議,是其他協(xié)議的基礎(chǔ)。2.2.2 TCP傳輸控制協(xié)議面向連接的通信可以使用可靠通信,在這時候,第四層協(xié)議發(fā)送數(shù)據(jù)接收方的確認,如果未收到數(shù)據(jù)或者數(shù)據(jù)被損壞,則請求重新傳輸。TCP協(xié)議就使用這種可靠通信。使用TCP協(xié)議的應(yīng)用層協(xié)議包括HTTP、FTP、SMTP和Telnet等。TCP要求在發(fā)送
17、數(shù)據(jù)之前必須打開連接。服務(wù)器應(yīng)用程序必須執(zhí)行一個稱作被動打開(passive open)的操作,以利用一個已知的端口號創(chuàng)建一個鏈接,這是,服務(wù)器并不是對網(wǎng)絡(luò)進行呼叫,而是偵聽并等待引入的請求??蛻魬?yīng)用程序必須執(zhí)行一個主動打開(active open),為此,它向服務(wù)器應(yīng)用程序發(fā)送一個同步序列號(SYN)以標識連接。客戶應(yīng)用程序可以將動態(tài)端口號作為本地端口使用。服務(wù)器必須向客戶發(fā)送一個確認(ACK)以及服務(wù)器的序列號(SYN)。隨后,客戶回復(fù)一個ACK,這樣就建立了鏈接?,F(xiàn)在可以發(fā)送和接收消息了。接收消息后,總是返回ACK消息。如果在收到ACK之前發(fā)送方已經(jīng)超時,則消息將被放到重發(fā)隊列中以再次發(fā)
18、送。由于它的握手機制,所以TCP協(xié)議比較復(fù)雜并且費時,但此協(xié)議在處理數(shù)據(jù)時對數(shù)據(jù)包的傳送有保障,從而使得在應(yīng)用程序協(xié)議中不需要再包括該功能。2.3 套接字套接字這個術(shù)語并沒有定義某個協(xié)議:它具有兩層含義,但兩者都與一個協(xié)議相關(guān)。第一個含義是套接字編程API,它最初由伯克利大學(xué)為BSD UNIX而創(chuàng)建。BSD套接字在經(jīng)過修改后被用作Windows環(huán)境的編程接口(并且被命名為WinSock)。WinSock API被包裝在System.Net.sockets命名空間的.NET類中。Windows Sockets 是一個獨立于協(xié)議的編程接口,用于編寫網(wǎng)絡(luò)應(yīng)用程序。套接字的第二層含義表示一個用于在進程
19、間進行通信的終端。在TCP/IP中,每個終端都與一個IP地址和一個端口號綁定。我們必須對流式套接字和數(shù)據(jù)報套接字這兩種類型進行區(qū)分。流失套接字用TCP/IP協(xié)議來使用面向連接的通信;另一方面,數(shù)據(jù)報套接字用UDP/IP來使用無連接通信。2.4 流2.4.1 流的基本概念流的概念已經(jīng)存在很長時間了。流是一個用于傳輸數(shù)據(jù)的對象。數(shù)據(jù)的傳輸有兩個方向:1) 如果數(shù)據(jù)從外部源傳輸?shù)匠绦蛑校@就是讀取流。2) 如果數(shù)據(jù)從程序傳輸?shù)酵獠吭矗@就是寫入流。外部源常常是一個文件,但也不完全都是文件,它還可以是:1) 網(wǎng)絡(luò),使用一定的網(wǎng)絡(luò)協(xié)議與網(wǎng)絡(luò)上其它計算機或終端交換數(shù)據(jù)。2) 一個指定的管道。3) 一塊內(nèi)存
20、區(qū)域。2.4.2 .NET中的流在這些情況中,微軟提供了一個.NET基類System.IO.MemoryStream來讀寫內(nèi)存數(shù)據(jù)使用System.Net.Sockets.NetworkStream處理網(wǎng)絡(luò)數(shù)據(jù)。讀寫管道沒有相應(yīng)的流類,但有一個常見的流類System.IO.Stream,如果要編寫一個這樣的類,可以從這個基類繼承。流對外部數(shù)據(jù)源不做任何假定。外部源還可以是代碼中的一個變量,使用流在變量之間傳輸數(shù)據(jù)的技術(shù)是一個非常有用的技巧,可以在數(shù)據(jù)類型之間轉(zhuǎn)換。在網(wǎng)絡(luò)編程中我們經(jīng)常會使用到網(wǎng)絡(luò)中的流對象:NetworkStream。它實現(xiàn)了.NET中標準的Stream機制,即可以使用Netw
21、orkStream通訊網(wǎng)絡(luò)套接字用標準的流操作進行網(wǎng)絡(luò)數(shù)據(jù)的讀寫。它提供以下的功能:1) 一個統(tǒng)一的從網(wǎng)絡(luò)中讀取數(shù)據(jù)的方法2) 與其他的.NET流兼容,這樣你可以很容易地移植程序。2.5 同步、異步、阻塞和非阻塞 同步(synchronous):所謂同步方式,就是發(fā)送方發(fā)送數(shù)據(jù)包以后,不等接受方響應(yīng),就接著發(fā)送下一個數(shù)據(jù)包。異步(asynchronous):異步方式就是當發(fā)送方發(fā)送一個數(shù)據(jù)包以后,一直等到接受方響應(yīng)后,才接著發(fā)送下一個數(shù)據(jù)包。阻塞(Block):指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時,直到調(diào)用成功才返回,否則此套節(jié)字就一直阻塞在網(wǎng)絡(luò)調(diào)用上,比如調(diào)用StreamReader 類的Readli
22、n ( )方法讀取網(wǎng)絡(luò)緩沖區(qū)中的數(shù)據(jù),如果調(diào)用的時候沒有數(shù)據(jù)到達,那么此Readlin ( )方法將一直掛在調(diào)用上,直到讀到一些數(shù)據(jù),此函數(shù)調(diào)用才返回非阻塞(Unblock):指在執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時,不管是否執(zhí)行成功,都立即返回。同樣調(diào)用StreamReader 類的Readlin ( )方法讀取網(wǎng)絡(luò)緩沖區(qū)中數(shù)據(jù),不管是否讀到數(shù)據(jù)都立即返回,而不會一直掛在此函數(shù)調(diào)用上。在Windows網(wǎng)絡(luò)通信軟件開發(fā)中,最為常用的方法就是異步非阻塞套接字。平常所說的C/S(客戶端/服務(wù)器)結(jié)構(gòu)的軟件采用的方式就是異步非阻塞模式的。其實在用C進行網(wǎng)絡(luò)編程中,我們并不需要了解什么同步、異步、阻塞和非阻塞的原
23、理和工作機制,因為在.Net FrameWrok SDK中已經(jīng)已經(jīng)把這些機制給封裝好了。2.6 C/S模型客戶機/服務(wù)器模型,又稱為Client/Server模型,簡稱C/S架構(gòu)。C/S計算技術(shù)在信息產(chǎn)業(yè)當中占有重要的地位。這種客戶機/服務(wù)器模型是一種非對稱式編程模式。該模式的基本思想是把集中在一起的應(yīng)用劃分成為功能不同的兩個部分,分別在不同的計算機上運行,通過它們之間的分工合作來實現(xiàn)一個完整的功能。對于這種模式而言其中一部分需要作為服務(wù)器,用來響應(yīng)并為客戶提供固定的服務(wù);另一部分則作為客戶機程序用來向服務(wù)器提出請求或要求某種服務(wù)。 在此“服務(wù)器”是指能在網(wǎng)絡(luò)上提供服務(wù)的任何程序。服務(wù)器接受網(wǎng)
24、絡(luò)上的請求,完成服務(wù)后將結(jié)果返回給申請者。對于簡單的服務(wù),把每個請求用一個IP數(shù)據(jù)報發(fā)給服務(wù)器,服務(wù)器用另一個數(shù)據(jù)報返回響應(yīng)。客戶機和服務(wù)器都是獨立的計算機。當一臺連入網(wǎng)絡(luò)的計算機向其他計算機提供各種網(wǎng)絡(luò)服務(wù)(如數(shù)據(jù)、文件的共享等)時,它就被叫做服務(wù)器。而那些用于訪問服務(wù)器資料的計算機則被叫做客戶機。嚴格說來,客戶機/服務(wù)器模型并不是從物理分布的角度來定義,它所體現(xiàn)的是一種網(wǎng)絡(luò)數(shù)據(jù)訪問的實現(xiàn)方式。采用這種結(jié)構(gòu)的系統(tǒng)目前應(yīng)用非常廣泛。如賓館、酒店的客房登記、結(jié)算系統(tǒng),超市的POS系統(tǒng),銀行、郵電的網(wǎng)絡(luò)系統(tǒng)等。各種網(wǎng)絡(luò)服務(wù)器基本都遵循同樣的算法:創(chuàng)建一個端口(Port),接受從網(wǎng)絡(luò)上來的客戶服務(wù)請
25、求,完成計算后把結(jié)果返回給客戶,如此反復(fù)。2.7 即時通信協(xié)議協(xié)議是一系列的步驟,它包括雙方或者多方,設(shè)計它的目的是要完成一項任務(wù)。即時通信協(xié)議,參與的雙方或者多方是即時通信的實體。協(xié)議必須是雙方或者多方參與的,一方單獨完成的就不算協(xié)議。這樣在協(xié)議動作的過程中,雙方必須交換信息,包括控制信息、狀態(tài)信息等等。這些信息的格式必須是協(xié)議參與方同意并且遵循的。好的協(xié)議要求清楚,完整,每一步都必須有明確的定義,并且不會引起誤解;對每種可能的情況必須規(guī)定具體的動作。有許多的 IM 系統(tǒng),如 AOL IM、Yahoo IM 和 MSN IM,它們使用了不同的技術(shù),而且它們互不兼容。為了創(chuàng)建即時通信的統(tǒng)一標準
26、,人們經(jīng)過了多次嘗試:IETF 的對話初始協(xié)議(SIP)和 即時通信對話初始協(xié)議和表示擴展協(xié)議(SIMPLE)、應(yīng)用交換協(xié)議(APEX)、顯示和即時通信協(xié)議(PRIM)及基于 XML 且開放的可擴展通信和表示協(xié)議(XMPP)協(xié)議(常稱為 Jabber 協(xié)議)。人們多次努力,試圖統(tǒng)一各大主要 IM 供應(yīng)商的標準(AOL、Yahoo 及 Microsoft),但無一成功,且每一種 IM 仍然繼續(xù)使用自己所擁有的協(xié)議。 本系統(tǒng)目的在于實現(xiàn)一個簡單的即時通信過程,沒有必要采用通用的比較復(fù)雜的即時通信協(xié)議,因此使用了簡單定義的XML標記定義來規(guī)范即時通信的各種網(wǎng)絡(luò)信息,在網(wǎng)絡(luò)中傳輸序列化的XML語言。3
27、 系統(tǒng)總體設(shè)計3.1 需求分析軟件針對局域網(wǎng)內(nèi)部用戶,實現(xiàn)用戶間的即時通信。需要分別實現(xiàn)服務(wù)器端和客戶端的軟件設(shè)計。服務(wù)器端負責(zé)監(jiān)聽用戶連接請求,負責(zé)連接數(shù)據(jù)庫存儲用戶信息,負責(zé)發(fā)送給用戶好友信息,負責(zé)發(fā)送心跳報文檢查用戶在線狀態(tài)并即時讓用戶更新好友在新信息??蛻舳税l(fā)起主動連接,向服務(wù)器請求登錄或者注冊??蛻舳丝梢孕薷年欠Q,可以加已知用戶為好友(類似于MSN的好友添加功能)??蛻舳酥g可以發(fā)起P2P模式的聊天,可以傳送文件。3.2 系統(tǒng)基本架構(gòu)基于C/S架構(gòu)的即時通信軟件便于對用戶信息進行統(tǒng)一管理和保存,面向特定的用戶,對信息的安全控制能力很強。為了減輕服務(wù)器負擔,客戶端之間的信息傳遞是采用P
28、2P模式的,服務(wù)器只負責(zé)用戶的注冊,登錄和用戶在線狀態(tài)的檢驗?;窘Y(jié)構(gòu)如圖:圖1 系統(tǒng)基本架構(gòu)3.3 功能模塊設(shè)計CLIENT:1. 注冊:(1) 可以完成客戶端注冊,客戶端可以通過填寫信息進行注冊,信息被發(fā)送到服務(wù)器端。2. 登錄:(1) 客戶可以輸入賬號和密碼進行登錄,客戶端會發(fā)送登錄信息等待服務(wù)器響應(yīng),登錄成功后會發(fā)出登錄成功信息并刷新好友列表。3. 修改:(1) 密碼修改:應(yīng)該有密碼修改功能(2) 信息修改:可以更改一些注冊信息4. 通信:(1) 即時聊天模塊:客戶端與客戶端之間建立線程進行即時聊天,也包含有簡單的對稱加解密算法功能。(2) 好友列表:可以對好友列表進行添加刪除等動作5
29、. 文件傳輸:(1) 文件傳輸:文件傳輸功能SERVER:1. 注冊回應(yīng):對客戶端傳送的注冊信息進行判斷。(1) HASH加密:對用戶的賬號和密碼信息進行HASH加密(2) 重復(fù)用戶檢查:將加密后信息與已存在賬號進行比較,檢查是否賬號已存在,如果存在就返回錯誤信息(3) 注冊成功:將可成功注冊的用戶賬號和密碼寫入數(shù)據(jù)庫內(nèi),并向客戶端返回成功信息2. 修改回應(yīng):(1) 對密碼和信息修改請求進行判斷,執(zhí)行和返回修改成功信息3. 登錄回應(yīng):(1) 對登錄的賬號和密碼進行加密檢查后發(fā)回正確或錯誤情況,并記錄上線信息(2) 好友列表發(fā)送:給成功登錄的賬號發(fā)送好友列表及好友上線信息(3) 上線信息發(fā)送:給
30、成功登錄的賬號的好友發(fā)送在線信息(包括IP,端口等等信息)4. 在線情況:(1) 對登錄,在線,離線的用戶情況進行統(tǒng)計,記錄和通知(2) 心跳測試:每隔一段時間發(fā)送報文測試用戶是否因意外原因離線(3) 情況記錄:將用戶登錄時間,IP,下線時間等信息記錄入數(shù)據(jù)庫3.4 邏輯圖圖2 邏輯圖3.5 數(shù)據(jù)庫設(shè)計3.5.1 實體關(guān)系圖服務(wù)器是作為記錄和讀取數(shù)據(jù)庫信息的載體,與客戶端關(guān)系并不復(fù)雜,這里需要重點考慮客戶端之間的關(guān)系。用戶與用戶之間的關(guān)系是較為特殊的遞歸關(guān)系,即描述發(fā)生在兩個相同實體上的關(guān)系。E-R圖如下:聊天文件傳輸nn用戶ID好友ID狀態(tài)IP客戶端賬號昵稱EmailID密碼好友分組狀態(tài)客戶
31、端賬號昵稱EmailID密碼好友分組IP圖3 E-R圖3.5.2 詳細列表數(shù)據(jù)庫包含兩個表,分別為記錄用戶信息的TCP_Userinfo和記錄用戶好友信息的TCP_Friendinfo。詳細設(shè)計見下面兩表:表1 用戶信息表TCP_UserInfoTCP_Userinfo列(屬性)名類型主鍵寬度是否允許為空備注UserIDnumericY9NOT NULL自增長UserAccountncharN20NOT NULL用戶帳號UserNicknamencharN20NOT NULL用戶昵稱,可重復(fù)UserEmailncharN20NOT NULL用戶EMAILJoinDatencharN35NOT
32、NULL注冊日期LastLoginncharY20NOT NULL最后登錄IPUserIPncharY20NOT NULL用戶IPUserFavvarcharN100NOT NULL用戶好友分組,有默認值UserQuestionncharY20NOT NULL密碼問題UserAnswerncharY20NOT NULL密碼答案UserPasswordncharN20NOT NULL用戶密碼UserOnlineintN4NOT NULL在線狀態(tài),1在,0不在表2 用戶好友表TCP_FriendInfoTCP_Userinfo列(屬性)名類型主鍵寬度是否允許為空備注InfoIDnumericY9N
33、OT NULL自增長UserIDncharN20NOT NULL用戶IDFriendIDncharN20NOT NULL用戶好友IDFriendGroupncharN20NOT NULL用戶好友分組4 系統(tǒng)實現(xiàn)4.1 使用XML定義的即時通信協(xié)議4.1.1 信息結(jié)構(gòu)MESSAGE.CS&UMESSAGE.CS這兩個C#類定義了包括服務(wù)器信息,狀態(tài)信息,注冊信息,登錄信息,聊天信息或者請求文件傳輸信息的函數(shù),服務(wù)器和客戶端通過將它們實例化和序列化再轉(zhuǎn)換成流在網(wǎng)絡(luò)上進行傳輸。UMESSAGE.CS主要代碼如下: Serializable public class UMessage public U
34、Message() private string _nickname; private string _password; private string _accounts; private string _email; private int _info;/表示注冊或者登錄信息,客戶端信息0為注冊,1為登錄;服務(wù)器返回信息0為用戶已存在,1為注冊成功,2為服務(wù)器未知錯誤,3為CLIENT在線檢查,10為登錄失敗,11為登錄成功 private Friend _friend; private int _fn; private string _fg; public string Nickname
35、 get return _nickname; set _nickname = value; public string Password get return _password; set _password = value; public string Accounts get return _accounts; set _accounts = value; public string Email get return _email; set _email = value; public int Info get return _info; set _info = value; public
36、 Friend Fri get return _friend; set _friend = value; public int Fn get return _fn; set _fn = value; public string Fg get return _fg; set _fg = value; 由于MESSAGE.CS與UMESSAGE.CS類似,在此不再詳述。服務(wù)器和客戶端都可以通過相同的代碼對UMESSAGE賦值,再通過XmlSerializer方法進行將UMESSAGE序列化為XML文檔,最后將XML文檔轉(zhuǎn)化為網(wǎng)絡(luò)流進行傳輸。代碼如下:#region 將登錄信息轉(zhuǎn)為UMessagep
37、rivate void Traslator()_message.Accounts=this.TextBox1.Text;_message.Nickname=;_message.Password=this.TextBox2.Text;_message.Email=;_message.Info=1;_message.Fri=null;#endregion4.1.2 數(shù)據(jù)結(jié)構(gòu)FriendStruct服務(wù)器如果保存和傳遞用戶的好友信息是難點之一。數(shù)據(jù)庫的設(shè)計和信息的傳遞辨別都是比較難實現(xiàn)的。在數(shù)據(jù)庫方面,每個用戶擁有各自的好友分組信息(UserFav),分組中間使用“,”分隔,在TCP_FriendI
38、nfo表中則分別保存了用戶ID和好友ID,使用一個INT字段保存分組信息。數(shù)據(jù)庫以用戶ID為標準對好友ID和分組信息進行內(nèi)連接查詢,就可以得到基本的好友信息了。代碼如下:select * from TCP_UserInfo join TCP_FriendInfo on TCP_FriendInfo.UserID= + uid + and TCP_UserInfo.UserID=TCP_FriendInfo.FriendID在好友信息的傳輸方面,首先定義一個FriendStruct數(shù)據(jù)結(jié)構(gòu)(當然也可以用枚舉完成)如下:using System;using System.Collections.G
39、eneric;using System.Text;namespace TCP public class FriendStruct public struct FileInfo public int filere;/接收和拒絕信息,1為接收,2為拒絕,3為取消 public string filename; public long filelength; public struct Friend public string account; public string nickname; public string IP; public string status; public string
40、fg;/好友分組 在MESSAGE.CS或者UMESSAGE.CS中,我們則定義了FriendStruct的數(shù)組。在C#中使用DATAREADER語句可以逐句讀取數(shù)據(jù)庫查詢的結(jié)果,再依次將結(jié)果賦值FriendStruct數(shù)組元素,就得到了便于發(fā)送和讀取的存放好友信息的數(shù)組。賦值代碼如下: while (getf.Read()/getf即是以上的數(shù)據(jù)庫查詢的datareader語句 ffi.account=getfUserAccount.ToString(); ffi.IP = getfUserIP.ToString(); ffi.nickname = getfUserNickname.ToSt
41、ring(); ffi.status = getfUserOnline.ToString(); ffi.fg = getfFriendGroup.ToString(); i+; getf.Close();4.2 數(shù)據(jù)庫連接類實現(xiàn)一個快捷簡單的數(shù)據(jù)庫連接的相關(guān)代碼是非常有必要的。實現(xiàn)的途徑也多種多樣,鑒于安全性和復(fù)雜性的需求不同,實現(xiàn)方法有簡有繁。本設(shè)計使用了一個簡單的類(UserData.CS)實現(xiàn)了簡單快捷的數(shù)據(jù)庫連接和讀取。主要代碼如下: public static SqlConnection connStr = new SqlConnection(Server=D96B85DD938A4
42、65.;uid=sa;pwd=change;database=TCPDB); public static SqlDataReader SqlReader(string sql, SqlConnection connstr) SqlDataReader sqldr = null; SqlCommand cmd = new SqlCommand(sql, connstr); if (cmd.Connection.State.ToString() = Closed) cmd.Connection.Open(); try sqldr = cmd.ExecuteReader(); catch (Exce
43、ption e) if (e != null) sqldr = null; return sqldr; /數(shù)據(jù)庫操作連接 public static string SqlCmd(string sql, SqlConnection connstr) string errorstr = null; SqlCommand sqlcmd = new SqlCommand(sql, connstr); if (sqlcmd.Connection.State.ToString() = Open) sqlcmd.Connection.Close(); sqlcmd.Connection.Open(); tr
44、y sqlcmd.ExecuteNonQuery(); catch (Exception e) if (e != null) errorstr = e.ToString(); sqlcmd.Connection.Close(); return errorstr; 在UserData.CS的基礎(chǔ)上,主程序可以更方便地實現(xiàn)數(shù)據(jù)庫連接操作,對數(shù)據(jù)庫進行讀寫和更新,在此不再詳述。4.3 服務(wù)器端這里顯示傳入的原始信息服務(wù)器端的界面設(shè)計是基于便于測試的目的而實現(xiàn)的。如下圖:這里顯示已連入的連接圖4 服務(wù)器端界面4.3.1 同步套接字網(wǎng)絡(luò)監(jiān)聽基于同步套接字的網(wǎng)絡(luò)監(jiān)聽器對服務(wù)器來說并不是最好的解決方案,但是
45、仍然可行并且實現(xiàn)簡單。主要代碼如下:開啟監(jiān)聽端口: public void Serve() int port = 8888; ServerIPEP = new IPEndPoint(IPAddress.Any, port); s = new Socket(ServerIPEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.Bind(EndPoint)ServerIPEP); s.Listen(10); alSock = new ArrayList();以下代碼讀取連入的連接,依次將連接加入可變長數(shù)組alsock,并且讀取傳入的信息
46、,進行反串行化: while (true) try uc = s.Accept(); alSock.Add(uc); this.tb_states.AppendText(System.Convert.ToString(uc); byte data = new byte2048; int rect = uc.Receive(data); byte chat = new byterect; Buffer.BlockCopy(data, 0, chat, 0, rect); UMessage umessage = (UMessage)_translator.Deserialize(new Memor
47、yStream(chat); int info = umessage.Info;對反串行化后的信息進行處理,通過info參數(shù)辨認客戶端行為(注冊或者登錄),對注冊的信息進行數(shù)據(jù)庫查詢,注冊信息可插入,則將用戶信息插入數(shù)據(jù)庫,否則返回客戶端“注冊出錯”的信息: #region 處理用戶注冊信息 if (info=0)/分辨出用戶發(fā)送的是注冊信息 string Accounts = umessage.Accounts; SqlDataReader usdr = FPara.SqlReader(select * from TCP_UserInfo where UserAccount= + Accou
48、nts + , FPara.connStr); if (usdr != null) if (usdr.Read() #region 此處寫入返回注冊失敗的代碼 Socket sc = (Socket)alSockalSock.IndexOf(uc, 0); sc.Send(chat); #endregion else #region 此處寫入插入數(shù)據(jù)庫用戶注冊信息的代碼 Stream ms = new MemoryStream(); Socket sc = (Socket)alSockalSock.IndexOf(uc, 0); if (FPara.SqlCmd(insert into TCP
49、_UserInfo (UserAccount,UserNickname,UserEmail,JoinDate,UserIP,UserPassword) values( + umessage.Accounts + , + umessage.Nickname + , + umessage.Email + , + System.DateTime.Now.ToString() + , + (IPEndPoint)uc.RemoteEndPoint).Address.ToString() + , + umessage.Password + ), FPara.connStr) = null) umessa
50、ge.Info = 1; _translator.Serialize(ms, umessage); byte d = new bytems.Length; ms.Seek(0, SeekOrigin.Begin); ms.Read(d, 0, d.Length); sc.Send(d); else umessage.Info = 2; _translator.Serialize(ms, umessage); byte d = new bytems.Length; ms.Seek(0, SeekOrigin.Begin); ms.Read(d, 0, d.Length); sc.Send(d);
51、 #endregion usdr.Close(); #endregion如果發(fā)現(xiàn)用戶發(fā)送的是登錄信息,就根據(jù)登錄信息中的用戶名和密碼判斷是否存在用戶,密碼是否正確,成功后再查詢出用戶的好友信息并且賦值給FriendStruct,再將信息返回給客戶端: #region 處理用戶登錄信息 else if (info = 1)/分辨出用戶發(fā)送的是登錄信息 string Accounts = umessage.Accounts; string Password = umessage.Password; SqlDataReader usdr = FPara.SqlReader(select * from TCP_UserInfo where UserAccount= + Accounts + and UserPassword=+Password+, FPara.connStr); if (usdr != null) if (usdr.Read() string uid=usdrUserID.ToString(); umessage.Fg = usdrUserFav.ToString(); usdr.Close();
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《有機化合物的合成》
- 某知名化妝品公司各部門職責(zé)
- 八年級數(shù)學(xué)上冊 第13章 全等三角形 13.4 三角形的尺規(guī)作圖優(yōu)質(zhì)課件 (新版)冀教版
- 化學(xué)九上人教版第六單元課題3第1課時
- 長春版小學(xué)五年級下《桂林山水甲天下》
- 現(xiàn)代社會更需要通才-攻辯
- 海底兩萬里(康塞爾)
- 客戶經(jīng)理積分考核介紹
- 現(xiàn)代教育技術(shù)培訓(xùn)
- 混凝土預(yù)制樁、鋼樁施工
- 氨基酸類藥物
- 威尼斯建筑與藝術(shù)雙年展掠影
- 地產(chǎn)營銷操作手冊課件
- 15機械的效率和自鎖222
- 建筑施工事故案例分析