基于Socket的聊天室_第1頁
基于Socket的聊天室_第2頁
基于Socket的聊天室_第3頁
基于Socket的聊天室_第4頁
基于Socket的聊天室_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、設(shè)計報告課 程 設(shè)計名稱 基于Socket的聊天室 專業(yè)班級 同組人姓名 同組人學(xué)號 實驗日期 指導(dǎo)教師 成 績 年 月 日一、設(shè)計目的和要求1、實驗?zāi)康木W(wǎng)絡(luò)聊天系統(tǒng)主要對象是局域網(wǎng)內(nèi)的用戶,使用交流更簡單。設(shè)計本系統(tǒng)的目標(biāo)如下:一臺電腦上能夠同時登陸多個不同的用戶。進入聊天頁面后用戶在用戶列表中可以看到在線用戶。用戶登陸成功后如果需要私聊可以在界面中勾選“悄悄話”選擇框進行私聊。若用戶需要群聊,可以在好友列表中選擇所有人進行群聊。2、實驗要求可以實現(xiàn)用戶顯示、公共聊天、私人聊天、系統(tǒng)消息提示等功能。二、設(shè)計說明(包括設(shè)計分析,系統(tǒng)運行環(huán)境,設(shè)計中的重點和難點,輸入和輸出輸出條件等)聊天室主要

2、由聊天室服務(wù)器和聊天室客戶端組成。聊天室服務(wù)器負責(zé)管理與客戶端的連接并發(fā)送消息給客戶端;聊天室客戶端負責(zé)接收或者發(fā)送聊天消息,登錄聊天室服務(wù)器等。一個簡單的服務(wù)器/客戶機聊天室模型如圖:1.首先啟動聊天室服務(wù)器,使得TcpListener開始監(jiān)聽端口,此時TcpListener會進入Pending狀態(tài),等待客戶端連接;2.其次,當(dāng)有客戶端連接后,通過AccepSocket返回與客戶端連接的Socket對象,然后通過讀寫Socket對象完成與聊天室客戶端的數(shù)據(jù)傳輸。聊天室客戶端成功啟動后,首先創(chuàng)建一個Socket對象,然后通過這個Socket對象連接聊天室服務(wù)器,連接成功后開通Socket完成數(shù)

3、據(jù)的接收和發(fā)送處理。聊天室服務(wù)器和聊天室客戶端消息的傳遞是這樣進行的:2.1聊天協(xié)議的應(yīng)答:在本聊天協(xié)議中只定義了兩種應(yīng)答:OK和ERR??蛻舳耸盏絆K應(yīng)答時,表示前面發(fā)送的聊天命令執(zhí)行成功;收到ERR應(yīng)答時,表示前面發(fā)送的聊天命令執(zhí)行失?。?.1.1聊天狀態(tài):聊天狀態(tài):CLOSED和CONNECTED狀態(tài)。當(dāng)執(zhí)行CONN命令后就進入CONNECTED狀態(tài)。只有在這個狀態(tài)下才可以執(zhí)行以下的聊天命令: CONN:連接聊天室服務(wù)器JOIN:加入聊天(通知其他用戶本人已經(jīng)加入聊天室服務(wù)器)LIST:列出所有的用戶(向客戶端發(fā)送全部的登錄用戶名字)CHAT:發(fā)送聊天信息(公開的聊天信息)PRIV:進行

4、私聊(三個參數(shù):私聊信息用戶;接收私聊信息用戶;發(fā)送信息)EXIT:客戶端向服務(wù)器發(fā)送離開請求;QUIT:退出聊天,服務(wù)器向客戶端發(fā)送退出命令(執(zhí)行QUIT命令聊天狀態(tài)變?yōu)镃LOSED)在執(zhí)行了QUIT命令后,聊天狀態(tài)就會變?yōu)镃LOSED的狀態(tài),此時客戶端只能執(zhí)行CONN命令再次登錄聊天室服務(wù)器。2.1.2 聊天命令 聊天命令主要有:CONN,JOIN,LIST,CHAT,PRIV和QUIT,下面分別介紹這些命令的定義和格式。1)CONN命令:CONN命令連接聊天室服務(wù)器。當(dāng)聊天室客戶端和聊天室服務(wù)器建立了Socket連接后,會馬上發(fā)送CONN命令。其命令格式如下:CONN|發(fā)送者的用戶名:附

5、件信息|CONN的參數(shù)為發(fā)送者的用戶名,一般是用戶用于聊天的昵稱。如果昵稱已經(jīng)存在,就發(fā)送ERR命令,否則就發(fā)送OK命令。下面是兩個CONN的鏈接過程,其中第一個是失敗的連接過程,第二個是成功的鏈接過程:CONN|tom|-ERR|USER TOM ALREADY EXISTSCONN|tom|_OK 2)JOIN命令JOIN命令用于通知用戶加入聊天聊天室服務(wù)器。當(dāng)一個用戶登錄到聊天室服務(wù)器后,服務(wù)器會發(fā)發(fā)送JOIN命令通知其他用戶有新用戶入聊天室服務(wù)器。JOIN的命令格式如下:JOIN|XXXX|JOIN的參數(shù)為剛剛登錄到聊天室服務(wù)器的用戶名,該命令可以不需要用戶端的響應(yīng),客戶端接收到該命名

6、后一般就是更新界面,顯示XXX已經(jīng)加入聊天室。對于剛剛加入的用戶,其狀態(tài)會在收到JOIN命令后變?yōu)镃ONNECTED狀態(tài)。3)LIST命令LIST命令用于向聊天室客戶端發(fā)送全部的登錄用戶名字,以便于用戶聊天室客戶端上選擇用戶進行私聊。LIST命令的命令格式如下:LISTUSERNAME 1| USERNAME2|.| USERNAMEX|LIST命令的參數(shù)可以有很多,用戶間用“|”分開,客戶端接收到該命令后會解析命令參數(shù)并把這些用戶顯示在界面上。4)CHAT命令CHAT命令用于向所有用戶發(fā)送聊天信息,這是公開的聊天信息其命令格式如下:CHAT|發(fā)送者的用戶名:發(fā)送內(nèi)容|CHAT命令的參數(shù)有兩個

7、,前面的是發(fā)送者的用戶名,后面的是發(fā)送內(nèi)容??蛻舳耸盏皆撁詈蟛恍枰M行如何處理,只有把信息顯示在界面上即可。5)PRIV命令PRIV命令是進行私聊的命令和CHAT命令不同,通過RPIV命令傳輸?shù)男畔⒅悄躹eil接受用戶看到。PRIV命令的格式如下PRIV|發(fā)送者的用戶名|接受者的用戶名|發(fā)送內(nèi)容| PRIV命令有三個參數(shù),第一個是發(fā)送私聊信息的用戶,第二個是接收私聊信息的用戶,第三個是發(fā)送的信息。6)QUIT和EXIT命令EXIT命令是客戶端向服務(wù)器發(fā)送離開請求,其命令格式如下EXIT|要離開的用戶名|EXIT的參數(shù)是要離開的用戶名。當(dāng)聊天室服務(wù)器接受到該命令后,會清除該用戶的一些記錄和數(shù)據(jù)

8、,然后向該客戶端發(fā)送QUIT命令,表示用戶已經(jīng)離開。QUIT命令的格式如下QUIT|客戶端收到該命令后,知道服務(wù)器已經(jīng)進行了一些處理,此時可以把鏈接狀態(tài)變?yōu)镃LOSED狀態(tài)。2.2系統(tǒng)運行環(huán)境Microsoft visual studio 2010三、系統(tǒng)詳細設(shè)計(包括程序模塊、流程、主要函數(shù)等) 3.1 聊天室服務(wù)器模塊 聊天室程序主要包括服務(wù)器和客戶端建立連接模塊、通信模塊、和關(guān)閉連接模塊 聊天室服務(wù)器是聊天室的主體,所以應(yīng)該首先創(chuàng)建聊天室服務(wù)器,只有建立了聊天室服務(wù)器,客戶才能連接到上面,從而進行聊天。服務(wù)器建立之后,一般處于監(jiān)聽狀態(tài),等待客戶機的連接申請。聊天室服務(wù)器的設(shè)計界面如下:

9、“當(dāng)前在線用戶”文本框顯示了當(dāng)前登陸到聊天室的客戶數(shù),“socket端口號”文本框用于輸入聊天室服務(wù)器監(jiān)聽的端口號?!癝ocket停止”按鈕用于停止聊天室服務(wù)器。下部左側(cè)的列表框用于顯示所有登錄的用戶,右邊的Richtextbox用于顯示所有的聊天信息、系統(tǒng)消息等。3.2 聊天室客戶端模塊 聊天室客戶端主要是好用戶進行交互的,其界面設(shè)計如下所示:聊天室客戶端的各個控件的功能如下所示:“服務(wù)器地址”文本框:用于輸入聊天室服務(wù)器的ip地址或者是聊天室服務(wù)器的機器名字等“端口號”文本框:聊天室服務(wù)器進行監(jiān)聽的端口號“用戶名”文本框:登錄聊天室服務(wù)器的用戶名。如果為空,單擊“登錄”按鈕時會提示用戶輸入

10、用戶名?!暗卿洝卑粹o:單擊該按鈕會連接到聊天室服務(wù)器?!半x開“按鈕:單擊該按鈕會退出聊天室服務(wù)器?!碑?dāng)前在線用戶列表”列表框:顯示當(dāng)前在線的全部用戶,列表中給出了這些用戶的名字?!跋到y(tǒng)信息”Richtextbox:顯示聊天信息、系統(tǒng)消息等?!扒那脑挕睆?fù)選框:選擇該按鈕后,只向某個選擇的用戶發(fā)送信息,其他用戶看不到這些信息。“發(fā)送”按鈕:用于發(fā)送聊天信息“顏色”按鈕:用于設(shè)置聊天信息或者系統(tǒng)信息的顏色。3.3 聊天室服務(wù)器的協(xié)議解析流程 聊天室服務(wù)器的數(shù)據(jù)接收流程圖從圖中可以看出,當(dāng)有客戶端連接聊天室服務(wù)器后,服務(wù)器立刻為這個客戶建立一個數(shù)據(jù)接收的獨立線程。在接收線程中,如果接收到了聊天命令,就

11、對其進行解析處理。 服務(wù)器接收到CONN命令,就向其他用戶發(fā)送JOIN命令告訴有用戶加入,然后把當(dāng)前的全部用戶信息返回到剛剛加入的用戶,以便于該用戶在界面上顯示用戶列表。當(dāng)接收到命令后,就清楚當(dāng)前用戶的信息,然后向其他用戶發(fā)送命令,告訴其他用戶有用戶退出了,這些用戶的客戶端會把離開的用戶從用戶列表中刪除。3.4 聊天室客戶端的協(xié)議解析流程 從圖中可以看出,當(dāng)客戶端連接到服務(wù)器后,服務(wù)器立刻建立一個數(shù)據(jù)接收的獨立線程。在接收線程中,如果收到了聊天命令,就對其進行解析處理。聊天室客戶端一共處理的命令有五種:OKERRLISTJOINQUIT命令。 當(dāng)接收到QUIT命令后,客戶端就將已經(jīng)離開的用戶從

12、用戶列表中清楚。如果不是這幾種命令,就表示普通的信息,需要把信息輸出到界面上。四、程序源代碼及注釋系統(tǒng)的主要功能有用戶顯示,公共聊天,私人聊天,系統(tǒng)信息等。下面分別介紹服務(wù)器和客戶端的實現(xiàn)方法。服務(wù)器端設(shè)計ChatServer.cs文件中包含了ClientServerForm類和Client類,其中ClientServerForm類是實現(xiàn)聊天室服務(wù)器的主要類,它封裝了聊天室服務(wù)器的基本操作。下面對服務(wù)器端實現(xiàn)代碼進行介紹:類和成員定義以及構(gòu)造函數(shù)ClientServerForm中引用了兩個與網(wǎng)絡(luò)操作相關(guān)的命名空間:System.Net和System.Net.Sockets。2)獲得有效的端口號

13、和IP地址下面的代碼用于獲得本地局域網(wǎng)或者撥號動態(tài)分配的IP地址。在啟動聊天室服務(wù)器時,會用到這些IP地址。private string getIPAddress()/ 獲得本機局域網(wǎng)IP地址 IPAddress AddressList = Dns.GetHostByName(Dns.GetHostName().AddressList;if (AddressList.Length1)return ;return AddressList0.ToString(); private static string getDynamicIPAddress( )/ 獲得撥號動態(tài)分配IP地址IPAddress

14、 AddressList = Dns.GetHostByName(Dns.GetHostName().AddressList;if (AddressList.Length2)return ;return AddressList1.ToString();聊天室服務(wù)器監(jiān)聽的端口號時通過getVaidPort函數(shù)獲得。通過System.Convert.ToInt32(port)語句嘗試把用戶輸入的端口號轉(zhuǎn)換為整型值。private int getValidPort(string port)int lport;/測試端口號是否有效try/是否為空if (port=) throw new Argumen

15、tException(端口號為空,不能啟動服務(wù)器);lport = System.Convert.ToInt32(port);catch (Exception e)/ArgumentException, /FormatException, /OverflowExceptionConsole.WriteLine(無效的端口號: + e.ToString();this.rtbSocketMsg.AppendText(無效的端口號: + e.ToString()+n);return -1;return lport;3)啟動聊天室服務(wù)器/當(dāng)單擊“Socket啟動”按鈕時,便開始監(jiān)聽指定的Socket端

16、口private void btnSocketStart_Click(object sender, System.EventArgs e)int port = getValidPort(tbSocketPort.Text);if (port connected - closedprivate string state = closed;public Client(ClientSeverForm server, Socket clientSocket)this.server = server;this.currentSocket = clientSocket;ipAddress = getRem

17、oteIPAddress();private string getRemoteIPAddress()return (IPEndPoint)currentSocket.RemoteEndPoint).Address.ToString();5)處理聊天命令服務(wù)器處理聊天命令時,需要向客戶端發(fā)送命令或者發(fā)送響應(yīng)信息。這些命令的發(fā)送都是通過SendToClient()函數(shù)實現(xiàn)的。/SendToClient()方法實現(xiàn)了向客戶端發(fā)送命令請求的功能private void SendToClient(Client client, string msg)System.Byte message=System.T

18、ext.Encoding.Default.GetBytes(msg.ToCharArray();client.CurrentSocket.Send(message,message.Length,0);以上代碼主要是用于服務(wù)器初始化和接收客戶端發(fā)送來的數(shù)據(jù)。4.2 客戶端設(shè)計 聊天室客戶端主要包含在文件ChatClient.cs文件中,該文件中包含了一個類ChatClientForm,該類中封裝了聊天室客戶端界面和聊天命令處理邏輯。下面介紹這個類中主要功能的實現(xiàn)方法。連接聊天室服務(wù)器聊天室客戶端啟動后,單擊“登入”按鈕會執(zhí)行下面的代碼連接聊天室服務(wù)器。程序首先檢查是否已經(jīng)是CONNECTED狀態(tài)

19、,如果是就退出。然后檢查用戶是否輸入了用戶名,如果沒有就顯示一個對話框,提示用戶應(yīng)該輸入用戶名。最后通過TcpClient方法連接聊天室服務(wù)器并發(fā)送CONN消息命令。/連接聊天服務(wù)器private void btnLogin_Click(object sender, System.EventArgs e)if (state = CONNECTED)return;if(this.tbUserName.Text.Length=0)MessageBox.Show(請輸入您的呢稱!,提示信息,MessageBoxButtons.OK,MessageBoxIcon.Exclamation);this.t

20、bUserName.Focus();return;try/創(chuàng)建一個客戶端套接字,它是Login的一個公共屬性,/將被傳遞給ChatClient窗體tcpClient=new TcpClient();/向指定的IP地址的服務(wù)器發(fā)出連接請求tcpClient.Connect(IPAddress.Parse(txtHost.Text),Int32.Parse(txtPort.Text);/獲得與服務(wù)器數(shù)據(jù)交互的流通道(NetworkStream)Stream=tcpClient.GetStream();/啟動一個新的線程,執(zhí)行方法this.ServerResponse(),/以便來響應(yīng)從服務(wù)器發(fā)回的

21、信息Thread thread=new Thread(new ThreadStart(this.ServerResponse);thread.Start();/向服務(wù)器發(fā)送“CONN”請求命令,/此命令的格式與服務(wù)器端的定義的格式一致,/命令格式為:命令標(biāo)志符(CONN)|發(fā)送者的用戶名|string cmd=CONN|+this.tbUserName.Text+|;/將字符串轉(zhuǎn)化為字符數(shù)組Byte outbytes=System.Text.Encoding.Default.GetBytes(cmd.ToCharArray();Stream.Write(outbytes,0,outbytes.

22、Length);catch(Exception ex)MessageBox.Show(ex.Message); 發(fā)送聊天信息 在連接到聊天室服務(wù)器后,用戶就可以輸入聊天信息了。輸入完畢單擊“發(fā)送”按鈕時,便會進入btnSend_Click處理程序。在btnSend_Click處理程序中,如果不是私聊,就把“CHAT”命令發(fā)送給服務(wù)器,否則(為私聊),就把“PRIV”命令發(fā)送給服務(wù)器。/注意命令格式一定要與服務(wù)器端的命令格式一致private void btnSend_Click(object sender, System.EventArgs e)tryif(!this.cbPrivate.Ch

23、ecked)/此時命令的格式是:/命令標(biāo)志符(CHAT)|發(fā)送者的用戶名:發(fā)送內(nèi)容|string message=CHAT|+ this.tbUserName.Text +:+tbSendContent.Text+|;tbSendContent.Text=;tbSendContent.Focus();/將字符串轉(zhuǎn)化為字符數(shù)組Byteoutbytes=System.Text.Encoding.Default.GetBytes(message.ToCharArray();Stream.Write(outbytes,0,outbytes.Length);elseif(lstUsers.Selecte

24、dIndex=-1)MessageBox.Show(請在列表中選擇一個用戶,提示信息,MessageBoxButtons.OK,MessageBoxIcon.Exclamation);return;string receiver=lstUsers.SelectedItem.ToString();/消息的格式是:/命令標(biāo)志符(PRIV)|發(fā)送者的用戶名|接收者的用戶名|發(fā)送內(nèi)容|string message=PRIV|+this.tbUserName.Text+|+receiver+|+tbSendContent.Text+|;tbSendContent.Text=;tbSendContent.Focus();/將字符串轉(zhuǎn)化為字符數(shù)組byte outbytes=System.Text.Encoding.ASCII.GetBytes(message.ToCharArray();Stream.Write(outb

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論