版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年重型運(yùn)輸車輛合作協(xié)議樣本版
- 標(biāo)準(zhǔn)個(gè)人設(shè)備抵押借款協(xié)議模板(2024版)版
- 審計(jì)維修合同模板
- 接稿收款合同模板
- 門店承包加盟合同模板
- 項(xiàng)目管理營銷合同模板
- 連鎖中醫(yī)館合同模板
- 海外招商合同模板
- 設(shè)計(jì)尾款結(jié)算合同模板
- 高速修改護(hù)欄承包合同模板
- 2024全國中小學(xué)生語文素養(yǎng)大賽知識素養(yǎng)試題庫及答案
- 中學(xué)語文教學(xué)法智慧樹知到期末考試答案章節(jié)答案2024年湖南城市學(xué)院
- 心理健康-過程性考核作業(yè)一-參考資料-江蘇開大
- 《養(yǎng)老機(jī)構(gòu)認(rèn)知障礙照護(hù)專區(qū)設(shè)置與服務(wù)規(guī)范》
- DLT 5630-2021 輸變電工程防災(zāi)減災(zāi)設(shè)計(jì)規(guī)程-PDF解密
- 2023全國高考四套文言文真題挖空訓(xùn)練(答案)
- 七年級第7周主題班會(huì)-第一次月考分析
- 科研設(shè)計(jì)及研究生論文撰寫智慧樹知到期末考試答案2024年
- 《百年孤獨(dú)(節(jié)選)》課件++2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修上冊
- 2024年北京京能清潔能源電力股份有限公司招聘筆試參考題庫含答案解析
- LED顯示屏年維護(hù)方案
評論
0/150
提交評論