TCP服務(wù)器與客戶端軟件(word文檔良心出品).doc_第1頁
TCP服務(wù)器與客戶端軟件(word文檔良心出品).doc_第2頁
TCP服務(wù)器與客戶端軟件(word文檔良心出品).doc_第3頁
TCP服務(wù)器與客戶端軟件(word文檔良心出品).doc_第4頁
TCP服務(wù)器與客戶端軟件(word文檔良心出品).doc_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:1 實(shí)驗(yàn)?zāi)康?理解和掌握軟件工程的設(shè)計(jì)理念與設(shè)計(jì)方法。2掌握某種數(shù)據(jù)庫管理以及可視化編程環(huán)境,掌握基于某種編程語言的信息系統(tǒng)或網(wǎng)絡(luò)通信軟件或某種通用總線接口的通信軟件的開發(fā)設(shè)計(jì)方法。2 實(shí)驗(yàn)題目及要求題目:TCP 服務(wù)器與客戶端軟件本題目要求使用TCP 協(xié)議實(shí)現(xiàn)若干臺電腦之間的通信。1任何一臺電腦都具有收發(fā)信息功能。2具有記錄查詢通信紀(jì)錄的功能。3有圖形化界面。4. 服務(wù)器可同時(shí)與多個(gè)客戶端通信。分別實(shí)現(xiàn)服務(wù)器和客戶端的程序。1山東建筑大

2、學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:3 實(shí)驗(yàn)系統(tǒng)設(shè)計(jì)3.1 需求分析:本次實(shí)驗(yàn)的題目是TCP 服務(wù)器與客戶端軟件,本題目要求使用TCP 協(xié)議實(shí)現(xiàn)若干臺電腦之間的通信。軟件針對局域網(wǎng)內(nèi)部用戶,實(shí)現(xiàn)用戶間的即時(shí)通信。需要分別實(shí)現(xiàn)服務(wù)器端和客戶端的軟件設(shè)計(jì),并有圖形化界面。服務(wù)器端負(fù)責(zé)監(jiān)聽用戶連接請求,負(fù)責(zé)連接數(shù)據(jù)庫存儲用戶信息,負(fù)責(zé)發(fā)送給用戶好友信息,負(fù)責(zé)發(fā)送心跳報(bào)文檢查用戶在線狀態(tài)并即時(shí)讓用戶更新好友在新信息??蛻舳税l(fā)起主動(dòng)連接,向服務(wù)器請求登錄或者注冊??蛻舳丝梢孕薷年欠Q,可以加已知

3、用戶為好友(類似于 MSN的好友添加功能)??蛻舳酥g可以發(fā)起P2P模式的聊天,可以傳送文件。3.2 主要理論依據(jù):1.TCP傳輸控制協(xié)議:TCP協(xié)議提供的是可靠的、面向連接的傳輸控制協(xié)議,即在傳輸數(shù)據(jù)前要先建立邏輯連接,然后再傳輸數(shù)據(jù),最后釋放連接 3個(gè)過程。 TCP提供端到端、全雙工通信;采用字節(jié)流方式,如果字節(jié)流太長,將其分段;提供緊急數(shù)據(jù)傳送功能。TCP 要求在發(fā)送數(shù)據(jù)之前必須打開連接。服務(wù)器應(yīng)用程序必須執(zhí)行一個(gè)稱作被動(dòng)打開( passive open )的操作,以利用一個(gè)已知的端口號創(chuàng)建一個(gè)鏈接,這是,服務(wù)器并不是對網(wǎng)絡(luò)進(jìn)行呼叫,而是偵聽并等待引入的請求。 客戶應(yīng)用程序必須執(zhí)行一個(gè)主

4、動(dòng)打開 (active open),為此,它向服務(wù)器應(yīng)用程序發(fā)送一個(gè)同步序列號( SYN)以標(biāo)識連接。客戶應(yīng)用程序可以將動(dòng)態(tài)端口號作為本地端口使用。 服務(wù)器必須向客戶發(fā)送一個(gè)確認(rèn) (ACK)以及服務(wù)器的序列號 ( SYN)。隨后,客戶回復(fù)一個(gè)ACK,這樣就建立了鏈接?,F(xiàn)在可以發(fā)送和接收消息了。接收消息后,總是返回 ACK消息。如果在收到 ACK之前發(fā)送方已經(jīng)超時(shí),則消息將被放到重發(fā)隊(duì)列中以再次發(fā)送。由于它的握手機(jī)制,所以 TCP協(xié)議比較復(fù)雜并且費(fèi)時(shí),但此協(xié)議在處理數(shù)據(jù)時(shí)對數(shù)據(jù)包的傳送有保障,從而使得在應(yīng)用程序協(xié)議中不需要再包括該功能。2山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名

5、:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:2.套接字:套接字這個(gè)術(shù)語并沒有定義某個(gè)協(xié)議:它具有兩層含義,但兩者都與一個(gè)協(xié)議相關(guān)。第一個(gè)含義是套接字編程 API,它最初由伯克利大學(xué)為 BSD UNIX而創(chuàng)建。 BSD套接字在經(jīng)過修改后被 用作 Windows 環(huán) 境的 編程 接口 (并 且被 命名 為 WinSock)。 WinSock API 被包 裝在 System.Net.sockets 命名空間的 .NET 類中。 Windows Sockets 是一個(gè)獨(dú)立于協(xié)議的編程接口,用于編寫網(wǎng)絡(luò)應(yīng)用程序。套接字的第二層含義表示一個(gè)用于在進(jìn)

6、程間進(jìn)行通信的終端。在TCP/IP 中,每個(gè)終端都與一個(gè) IP 地址和一個(gè)端口號綁定。我們必須對流式套接字和數(shù)據(jù)報(bào)套接字這兩種類型進(jìn)行區(qū)分。流失套接字用TCP/IP 協(xié)議來使用面向連接的通信;另一方面,數(shù)據(jù)報(bào)套接字用UDP/IP 來使用無連接通信。3. C/S 模型:客戶機(jī) / 服務(wù)器模型,又稱為Client/Server模型,簡稱 C/S 架構(gòu)。 C/S 計(jì)算技術(shù)在信息產(chǎn)業(yè)當(dāng)中占有重要的地位。這種客戶機(jī) / 服務(wù)器模型是一種非對稱式編程模式。 該模式的基本思想是把集中在一起的應(yīng)用劃分成為功能不同的兩個(gè)部分 , 分別在不同的計(jì)算機(jī)上運(yùn)行, 通過它們之間的分工合作來實(shí)現(xiàn)一個(gè)完整的功能。對于這種模

7、式而言其中一部分需要作為服務(wù)器,用來響應(yīng)并為客戶提供固定的服務(wù);另一部分則作為客戶機(jī)程序用來向服務(wù)器提出請求或要求某種服務(wù)。在此“服務(wù)器”是指能在網(wǎng)絡(luò)上提供服務(wù)的任何程序。服務(wù)器接受網(wǎng)絡(luò)上的請求,完成服務(wù)后將結(jié)果返回給申請者。對于簡單的服務(wù),把每個(gè)請求用一個(gè)IP 數(shù)據(jù)報(bào)發(fā)給服務(wù)器,服務(wù)器用另一個(gè)數(shù)據(jù)報(bào)返回響應(yīng)??蛻魴C(jī)和服務(wù)器都是獨(dú)立的計(jì)算機(jī)。當(dāng)一臺連入網(wǎng)絡(luò)的計(jì)算機(jī)向其他計(jì)算機(jī)提供各種網(wǎng)絡(luò)服務(wù) ( 如數(shù)據(jù)、文件的共享等) 時(shí),它就被叫做服務(wù)器。而那些用于訪問服務(wù)器資料的計(jì)算機(jī)則被叫做客戶機(jī)。嚴(yán)格說來,客戶機(jī)/ 服務(wù)器模型并不是從物理分布的角度來定義,它所體現(xiàn)的是一種網(wǎng)絡(luò)數(shù)據(jù)訪問的實(shí)現(xiàn)方式。采用這

8、種結(jié)構(gòu)的系統(tǒng)目前應(yīng)用非常廣泛。如賓館、酒店的客房登記、結(jié)算系統(tǒng),超市的POS系統(tǒng),銀行、郵電的網(wǎng)絡(luò)系統(tǒng)等。各種網(wǎng)絡(luò)服務(wù)器基本都遵循同樣的算法: 創(chuàng)建一個(gè)端口 (Port) ,接受從網(wǎng)絡(luò)上來的客戶服務(wù)請求,完成計(jì)算后把結(jié)果返回給客戶,如此反復(fù)。3山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:3.3 系統(tǒng)基本構(gòu)架:基于 C/S 架構(gòu)的即時(shí)通信軟件便于對用戶信息進(jìn)行統(tǒng)一管理和保存,面向特定的用戶,對信息的安全控制能力很強(qiáng)。為了減輕服務(wù)器負(fù)擔(dān),客戶端之間的信息傳遞是采用P2P 模式的,服務(wù)器

9、只負(fù)責(zé)用戶的注冊,登錄和用戶在線狀態(tài)的檢驗(yàn)。基本結(jié)構(gòu)如圖:注冊和登錄信息SERVER注冊和登錄信息返回信息返回信息CLIENT聊天信息 ,文件傳輸CLIENT3.4 功能模塊設(shè)計(jì):CLIENT:1. 注冊:(1) 可以完成客戶端注冊,客戶端可以通過填寫信息進(jìn)行注冊,信息被發(fā)送到服務(wù)器端。2. 登錄:(1) 客戶可以輸入賬號和密碼進(jìn)行登錄, 客戶端會(huì)發(fā)送登錄信息等待服務(wù)器響應(yīng), 登錄成功后會(huì)發(fā)出登錄成功信息并刷新好友列表。3. 修改:(1) 密碼修改:應(yīng)該有密碼修改功能(2) 信息修改:可以更改一些注冊信息4. 通信:(1) 即時(shí)聊天模塊: 客戶端與客戶端之間建立線程進(jìn)行即時(shí)聊天, 也包含有簡單

10、的對稱加密4山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:算法功能。(2) 好友列表:可以對好友列表進(jìn)行添加刪除等動(dòng)作5. 文件傳輸:(1) 文件傳輸:文件傳輸功能SERVER:1. 注冊回應(yīng):對客戶端傳送的注冊信息進(jìn)行判斷。(1)HASH加密:對用戶的賬號和密碼信息進(jìn)行HASH加密(2) 重復(fù)用戶檢查: 將加密后信息與已存在賬號進(jìn)行比較, 檢查是否賬號已存在, 如果存在就返回錯(cuò)誤信息(3) 注冊成功:將可成功注冊的用戶賬號和密碼寫入數(shù)據(jù)庫內(nèi),并向客戶端返回成功信息2. 修改回應(yīng):(

11、1) 對密碼和信息修改請求進(jìn)行判斷,執(zhí)行和返回修改成功信息3. 登錄回應(yīng) :(1) 對登錄的賬號和密碼進(jìn)行加密檢查后發(fā)回正確或錯(cuò)誤情況,并記錄上線信息(2) 好友列表發(fā)送:給成功登錄的賬號發(fā)送好友列表及好友上線信息(3) 上線信息發(fā)送:給成功登錄的賬號的好友發(fā)送在線信息(包括IP, 端口等等信息)4. 在線情況 :(1) 對登錄,在線,離線的用戶情況進(jìn)行統(tǒng)計(jì),記錄和通知(2) 心跳測試:每隔一段時(shí)間發(fā)送報(bào)文測試用戶是否因意外原因離線(3) 情況記錄:將用戶登錄時(shí)間, IP ,下線時(shí)間等信息記錄入數(shù)據(jù)庫3.5 邏輯圖:具體邏輯圖如下圖所示:5山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102

12、姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:注冊失敗注冊成功注冊YN注冊信息檢查密碼修改用戶信息管理信息修改CLIENT好友列表發(fā)送上線信息登錄發(fā)送取得好友列表消息加密即時(shí)聊天消息解密文件傳輸離線NHASH 加密注冊回應(yīng)修改回應(yīng)SERVER登錄回應(yīng)在線情況Y心跳在線情況測試記錄6山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:3.6 數(shù)據(jù)庫設(shè)計(jì):服務(wù)器是作為記錄和讀取數(shù)據(jù)庫信息的載體,與客戶端關(guān)系并不復(fù)雜,這里需要重點(diǎn)考慮客戶

13、端之間的關(guān)系。用戶與用戶之間的關(guān)系是較為特殊的遞歸關(guān)系,即描述發(fā)生在兩個(gè)相同實(shí)體上的關(guān)系。E-R 圖如下:Email密碼用戶 IDEmail好友分組好友分組密碼狀態(tài)狀態(tài)客戶端n聊天n客戶端文件IPIPID昵稱賬號ID好友 ID昵稱賬號數(shù)據(jù)庫包含兩個(gè)表,分別為記錄用戶信息的TCP_Userinfo和記錄用戶好友信息的TCP_Friendinfo 。詳細(xì)設(shè)計(jì)見下面兩表:7山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:表 1用戶信息表 TCP_UserInfoTCP_Userinfo列(屬

14、性)名類型主鍵寬度是否允許為空備注UserIDnumericY9NOT NULL自增長UserAccountncharN20NOT NULL用戶帳號UserNicknamencharN20NOT NULL用戶昵稱,可重復(fù)UserEmailncharN20NOT NULL用戶 EMAILJoinDatencharN35NOT NULL注冊日期LastLoginncharY20NOT NULL最后登錄 IPUserIPncharY20NOT NULL用戶 IPUserFavvarcharN100NOT NULL用戶好友分組,有默認(rèn)值UserQuestionncharY20NOT NULL密碼問題U

15、serAnswerncharY20NOT NULL密碼答案UserPasswordncharN20NOT NULL用戶密碼UserOnlineintN4NOT NULL在線狀態(tài), 1 在, 0 不在表 2用戶好友表 TCP_FriendInfoTCP_Userinfo列(屬性)名類型主鍵寬度是否允許為空備注InfoIDnumericY9NOT NULL自增長UserIDncharN20NOT NULL用戶 IDFriendIDncharN20NOT NULL用戶好友 IDFriendGroupncharN20NOT NULL用戶好友分組8山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓

16、名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:4 系統(tǒng)實(shí)現(xiàn)4.1 使用 XML定義的即時(shí)通信協(xié)議:信息結(jié)構(gòu) MESSAGE.CS&UMESSAGE.CS這兩個(gè) C#類定義了包括服務(wù)器信息,狀態(tài)信息,注冊信息,登錄信息,聊天信息或者請求文件傳輸信息的函數(shù),服務(wù)器和客戶端通過將它們實(shí)例化和序列化再轉(zhuǎn)換成流在網(wǎng)絡(luò)上進(jìn)行傳輸。 UMESSAGE.CS主要代碼如下:Serializablepublic class UMessagepublic UMessage() private string _nickname;private string _p

17、assword;private string _accounts;private string _email;private int _info;/表示注冊或者登錄信息,客戶端信息0 為注冊, 1 為登錄;服務(wù)器返回信息0 為用戶已存在, 1 為注冊成功 ,2 為服務(wù)器未知錯(cuò)誤, 3 為 CLIENT在線檢查,10 為登錄失敗, 11 為登錄成功private Friend _friend;private int _fn;private string _fg;public string Nicknameget return _nickname; set _nickname = value; p

18、ublic string Passwordget return _password; set _password = value; public string Accountsget return _accounts; set _accounts = value; 9山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:public string Emailget return _email; set _email = value; public int Infoget return _in

19、fo; set _info = value; public Friend Friget return _friend; set _friend = value; public int Fnget return _fn; set _fn = value; public string Fgget return _fg; set _fg = value; 由于 MESSAGE.CS與 UMESSAGE.CS類似,在此不再詳述。服務(wù)器和客戶端都可以通過相同的代碼對UMESSAGE賦值,再通過 XmlSerializer方法進(jìn)行將 UMESSAGE序列化為 XML文檔,最后將XML文檔轉(zhuǎn)化為網(wǎng)絡(luò)流進(jìn)行傳

20、輸。代碼如下:#region將登錄信息轉(zhuǎn)為UMessageprivate void Traslator()_message.Accounts=this.TextBox1.Text;_message.Nickname=;_message.Password=this.TextBox2.Text;_message.Email=;_message.Info=1;10山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:_message.Fri=null;#endregion4.2 數(shù)據(jù)結(jié)構(gòu) Frie

21、ndStruct:服務(wù)器如果保存和傳遞用戶的好友信息是難點(diǎn)之一。數(shù)據(jù)庫的設(shè)計(jì)和信息的傳遞辨別都是比較難實(shí)現(xiàn)的。在數(shù)據(jù)庫方面,每個(gè)用戶擁有各自的好友分組信息(UserFav),分組中間使用“, ”分隔,在 TCP_FriendInfo 表中則分別保存了用戶 ID 和好友 ID,使用一個(gè) INT 字段保存分組信息。數(shù)據(jù)庫以用戶 ID 為標(biāo)準(zhǔn)對好友 ID 和分組信息進(jìn)行內(nèi)連接查詢,就可以得到基本的好友信息了。在好友信息的傳輸方面,首先定義一個(gè)FriendStruct數(shù)據(jù)結(jié)構(gòu)(當(dāng)然也可以用枚舉完成)如下:using System;using System.Collections.Generic;usi

22、ng System.Text;namespace TCPpublic class FriendStructpublic struct FileInfopublic int filere;/接收和拒絕信息 ,1 為接收, 2 為拒絕, 3 為取消public string filename;public long filelength;public struct Friendpublic string account;public string nickname;public string IP;public string status;public string fg;/好友分組11山東建筑大

23、學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:在 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();f

24、fi.IP = getfUserIP.ToString();ffi.nickname = getfUserNickname.ToString();ffi.status = getfUserOnline.ToString();ffi.fg = getfFriendGroup.ToString();i+;getf.Close();4.3 數(shù)據(jù)庫連接類:實(shí)現(xiàn)一個(gè)快捷簡單的數(shù)據(jù)庫連接的相關(guān)代碼是非常有必要的。實(shí)現(xiàn)的途徑也多種多樣,鑒于安全性和復(fù)雜性的需求不同,實(shí)現(xiàn)方法有簡有繁。 本設(shè)計(jì)使用了一個(gè)簡單的類 ( UserData.CS)實(shí)現(xiàn)了簡單快捷的數(shù)據(jù)庫連接和讀取。主要代碼如下:publicstati

25、cSqlConnectionconnStr=newSqlConnection(Server=D96B85DD938A465.;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.Connect

26、ion.Open();trysqldr = cmd.ExecuteReader();catch (Exception e)if (e != null) sqldr = null;return sqldr;/ 數(shù)據(jù)庫操作連接12山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:public static string SqlCmd(string sql, SqlConnection connstr)string errorstr = null;SqlCommand sqlcmd = new

27、 SqlCommand(sql, connstr);if (sqlcmd.Connection.State.ToString() = Open) sqlcmd.Connection.Close();sqlcmd.Connection.Open();trysqlcmd.ExecuteNonQuery();catch (Exception e)if (e != null) errorstr = e.ToString();sqlcmd.Connection.Close();return errorstr;在 UserData.CS 的基礎(chǔ)上,主程序可以更方便地實(shí)現(xiàn)數(shù)據(jù)庫連接操作,對數(shù)據(jù)庫進(jìn)行讀寫和更

28、新,在此不再詳述。4.4 服務(wù)器端:服務(wù)器端的界面設(shè)計(jì)是基于便于測試的目的而實(shí)現(xiàn)的。如下圖:13山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:1. 同步套接字網(wǎng)絡(luò)監(jiān)聽基于同步套接字的網(wǎng)絡(luò)監(jiān)聽器對服務(wù)器來說并不是最好的解決方案,但是仍然可行并且實(shí)現(xiàn)簡單。主要代碼如下:開啟監(jiān)聽端口:public void Serve()int port = 8888;ServerIPEP = new IPEndPoint(IPAddress.Any, port);s = new Socket(Serve

29、rIPEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);s.Bind(EndPoint)ServerIPEP);s.Listen(10);alSock = new ArrayList();以下代碼讀取連入的連接,依次將連接加入可變長數(shù)組alsock ,并且讀取傳入的信息,進(jìn)行反串行化:while (true)tryuc = s.Accept();alSock.Add(uc);this.tb_states.AppendText(System.Convert.ToString(uc); byte data = new byte2048;i

30、nt rect = uc.Receive(data);byte chat = new byterect;Buffer.BlockCopy(data, 0, chat, 0, rect);UMessage umessage = (UMessage)_translator.Deserialize(new MemoryStream(chat);int info = umessage.Info;對反串行化后的信息進(jìn)行處理,通過 info 參數(shù)辨認(rèn)客戶端行為(注冊或者登錄) ,對注冊的信息進(jìn)行數(shù)據(jù)庫查詢,注冊信息可插入,則將用戶信息插入數(shù)據(jù)庫,否則返回客戶端“注冊出錯(cuò)”的信息:#region處理用戶注冊

31、信息if (info=0)/分辨出用戶發(fā)送的是注冊信息string Accounts = umessage.Accounts;SqlDataReader usdr = FPara.SqlReader(select * from TCP_UserInfo where UserAccount= + Accounts + , FPara.connStr);14山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院: 信電學(xué)院班級:電信 102姓名: 公維蒙學(xué)號: 2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:if (usdr != null)if (usdr.Read()#region此處

32、寫入返回注冊失敗的代碼Socketsc =(Socket)alSockalSock.IndexOf(uc,0);sc.Send(chat);#endregionelse#region此處寫入插入數(shù)據(jù)庫用戶注冊信息的代碼Stream ms = new MemoryStream();Socketsc =(Socket)alSockalSock.IndexOf(uc,0);if(FPara.SqlCmd(insertintoTCP_UserInfo(UserAccount,UserNickname,UserEmail,JoinDate,UserIP,UserPassword)values(+umes

33、sage.Accounts + , + umessage.Nickname + , + umessage.Email + , +System.DateTime.Now.ToString()+,+(IPEndPoint)uc.RemoteEndPoint).Address.ToString()+ ,+ umessage.Password + ),FPara.connStr) = null)umessage.Info = 1;_translator.Serialize(ms, umessage);byte d = new bytems.Length;ms.Seek(0, SeekOrigin.Be

34、gin);ms.Read(d, 0, d.Length);sc.Send(d);elseumessage.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);#endregion15山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:usdr.Close();#endreg

35、ion如果發(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= + Acco

36、unts + and UserPassword=+Password+, FPara.connStr);if (usdr != null)if (usdr.Read()string uid=usdrUserID.ToString();umessage.Fg = usdrUserFav.ToString();usdr.Close();SqlDataAdapter sdr = new SqlDataAdapter(select* from TCP_UserInfo join TCP_FriendInfo on TCP_FriendInfo.UserID= + uid + andTCP_UserInf

37、o.UserID=TCP_FriendInfo.FriendID, FPara.connStr);DataSet ds = new DataSet();sdr.Fill(ds, find);int xxx=ds.Tablesfind.Rows.Count;FPara.SqlCmd(update TCP_UserInfo set UserIP=+(IPEndPoint)uc.RemoteEndPoint).Address.ToString()+,UserOnline=1whereUserAccount= + Accounts + , FPara.connStr);ff=new Friendxxx

38、;int i=0;SqlDataReader getf = FPara.SqlReader(select *fromTCP_UserInfo joinTCP_FriendInfo onTCP_FriendInfo.UserID=+ uid+ andTCP_UserInfo.UserID=TCP_FriendInfo.FriendID, FPara.connStr);while (getf.Read()16山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:ffi.account=getfU

39、serAccount.ToString();ffi.IP = getfUserIP.ToString();ffi.nickname = getfUserNickname.ToString();ffi.status = getfUserOnline.ToString();ffi.fg = getfFriendGroup.ToString();i+;getf.Close();#region此處寫入登錄成功代碼Stream ms = new MemoryStream();Socketsc=(Socket)alSockalSock.IndexOf(uc,0);this.lb_users.Items.A

40、dd(alSock.IndexOf(uc).ToString();umessage.Info = 11;umessage.Fri = ff;umessage.Fn = xxx;_translator.Serialize(ms, umessage);byte d = new bytems.Length;ms.Seek(0, SeekOrigin.Begin);ms.Read(d, 0, d.Length);sc.Send(d);/在 tb_status中寫入服務(wù)器返回給客戶端的代碼便于測試觀察this.tb_states.AppendText(System.Text.Encoding.Defau

41、lt.GetString(d); #endregionelseusdr.Close();#region此處寫入登錄失敗代碼Stream ms = new MemoryStream();Socketsc=(Socket)alSockalSock.IndexOf(uc,0);17山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:umessage.Info = 10;_translator.Serialize(ms, umessage);byte d = new bytems.Length;m

42、s.Seek(0, SeekOrigin.Begin);ms.Read(d, 0, d.Length);sc.Send(d);#endregion#endregionTb_states 是個(gè)用于監(jiān)視 SOCKET傳入信息的文本框,便于觀察和測試相關(guān)信息:this.tb_states.AppendText( + uc.RemoteEndPoint.ToString()+ + System.Text.Encoding.Default.GetString(chat);catch (Exception ex)MessageBox.Show(ex.Message);以上代碼也包含了對客戶端的請求信息的判

43、斷和對客戶端返回信息的生成和傳輸。2. 多線程對于服務(wù)器來說,多線程是必不可少的,否則它將無法處理不斷請求的新連接。C#的System.Threading提供了多線程編程的支持。本設(shè)計(jì)實(shí)現(xiàn)代碼如下:this.th = new Thread(new ThreadStart(Serve);/新建一個(gè)用于監(jiān)聽的線程th.Start();/打開新線程不僅僅是服務(wù)器,基于P2P模式聊天的客戶端也必須支持多線程運(yùn)行,實(shí)現(xiàn)代碼與之類似,在客戶端設(shè)計(jì)說明中將不再敘述。18山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年

44、12 月日 成績:4.5 客戶端:1. 同步套接字客戶端客戶端發(fā)起同步套接字連接,并傳送登錄或者注冊信息,由于兩者方式類似,這里僅列出用戶登錄的代碼:#region發(fā)送服務(wù)器登錄信息,并接收服務(wù)器反饋信息19山東建筑大學(xué)實(shí)驗(yàn)報(bào)告學(xué)院:信電學(xué)院班級:電信 102 姓名:公維蒙學(xué)號:2010081266課程:應(yīng)用軟件綜合實(shí)驗(yàn)實(shí)驗(yàn)日期: 2013 年 12 月日 成績:public void Client()建立 SOCKET發(fā)送信息:tryIPEndPoint ServerIPEP = new IPEndPoint(IPAddress.Parse(6),8888);c =

45、new Socket(ServerIPEP.AddressFamily,SocketType.Stream,ProtocolType.Tcp);c.Connect(EndPoint)ServerIPEP);s = new MemoryStream();_translator.Serialize(s,_message);byte d=new bytes.Length;s.Seek(0, SeekOrigin.Begin);s.Read(d, 0, d.Length);int i = c.Send(d, 0, d.Length, SocketFlags.None);catch(Exception ex)MessageBox.Show(ex.Mess

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論