基于Socket的聊天室_第1页
基于Socket的聊天室_第2页
基于Socket的聊天室_第3页
基于Socket的聊天室_第4页
基于Socket的聊天室_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、设计报告课 程 设计名称 基于Socket的聊天室 专业班级 同组人姓名 同组人学号 实验日期 指导教师 成 绩 年 月 日一、设计目的和要求1、实验目的网络聊天系统主要对象是局域网内的用户,使用交流更简单。设计本系统的目标如下:一台电脑上能够同时登陆多个不同的用户。进入聊天页面后用户在用户列表中可以看到在线用户。用户登陆成功后如果需要私聊可以在界面中勾选“悄悄话”选择框进行私聊。若用户需要群聊,可以在好友列表中选择所有人进行群聊。2、实验要求可以实现用户显示、公共聊天、私人聊天、系统消息提示等功能。二、设计说明(包括设计分析,系统运行环境,设计中的重点和难点,输入和输出输出条件等)聊天室主要

2、由聊天室服务器和聊天室客户端组成。聊天室服务器负责管理与客户端的连接并发送消息给客户端;聊天室客户端负责接收或者发送聊天消息,登录聊天室服务器等。一个简单的服务器/客户机聊天室模型如图:1.首先启动聊天室服务器,使得TcpListener开始监听端口,此时TcpListener会进入Pending状态,等待客户端连接;2.其次,当有客户端连接后,通过AccepSocket返回与客户端连接的Socket对象,然后通过读写Socket对象完成与聊天室客户端的数据传输。聊天室客户端成功启动后,首先创建一个Socket对象,然后通过这个Socket对象连接聊天室服务器,连接成功后开通Socket完成数

3、据的接收和发送处理。聊天室服务器和聊天室客户端消息的传递是这样进行的:2.1聊天协议的应答:在本聊天协议中只定义了两种应答:OK和ERR。客户端收到OK应答时,表示前面发送的聊天命令执行成功;收到ERR应答时,表示前面发送的聊天命令执行失败;2.1.1聊天状态:聊天状态:CLOSED和CONNECTED状态。当执行CONN命令后就进入CONNECTED状态。只有在这个状态下才可以执行以下的聊天命令: CONN:连接聊天室服务器JOIN:加入聊天(通知其他用户本人已经加入聊天室服务器)LIST:列出所有的用户(向客户端发送全部的登录用户名字)CHAT:发送聊天信息(公开的聊天信息)PRIV:进行

4、私聊(三个参数:私聊信息用户;接收私聊信息用户;发送信息)EXIT:客户端向服务器发送离开请求;QUIT:退出聊天,服务器向客户端发送退出命令(执行QUIT命令聊天状态变为CLOSED)在执行了QUIT命令后,聊天状态就会变为CLOSED的状态,此时客户端只能执行CONN命令再次登录聊天室服务器。2.1.2 聊天命令 聊天命令主要有:CONN,JOIN,LIST,CHAT,PRIV和QUIT,下面分别介绍这些命令的定义和格式。1)CONN命令:CONN命令连接聊天室服务器。当聊天室客户端和聊天室服务器建立了Socket连接后,会马上发送CONN命令。其命令格式如下:CONN|发送者的用户名:附

5、件信息|CONN的参数为发送者的用户名,一般是用户用于聊天的昵称。如果昵称已经存在,就发送ERR命令,否则就发送OK命令。下面是两个CONN的链接过程,其中第一个是失败的连接过程,第二个是成功的链接过程:CONN|tom|-ERR|USER TOM ALREADY EXISTSCONN|tom|_OK 2)JOIN命令JOIN命令用于通知用户加入聊天聊天室服务器。当一个用户登录到聊天室服务器后,服务器会发发送JOIN命令通知其他用户有新用户入聊天室服务器。JOIN的命令格式如下:JOIN|XXXX|JOIN的参数为刚刚登录到聊天室服务器的用户名,该命令可以不需要用户端的响应,客户端接收到该命名

6、后一般就是更新界面,显示XXX已经加入聊天室。对于刚刚加入的用户,其状态会在收到JOIN命令后变为CONNECTED状态。3)LIST命令LIST命令用于向聊天室客户端发送全部的登录用户名字,以便于用户聊天室客户端上选择用户进行私聊。LIST命令的命令格式如下:LISTUSERNAME 1| USERNAME2|.| USERNAMEX|LIST命令的参数可以有很多,用户间用“|”分开,客户端接收到该命令后会解析命令参数并把这些用户显示在界面上。4)CHAT命令CHAT命令用于向所有用户发送聊天信息,这是公开的聊天信息其命令格式如下:CHAT|发送者的用户名:发送内容|CHAT命令的参数有两个

7、,前面的是发送者的用户名,后面的是发送内容。客户端收到该命令后不需要进行如何处理,只有把信息显示在界面上即可。5)PRIV命令PRIV命令是进行私聊的命令和CHAT命令不同,通过RPIV命令传输的信息智能veil接受用户看到。PRIV命令的格式如下PRIV|发送者的用户名|接受者的用户名|发送内容| PRIV命令有三个参数,第一个是发送私聊信息的用户,第二个是接收私聊信息的用户,第三个是发送的信息。6)QUIT和EXIT命令EXIT命令是客户端向服务器发送离开请求,其命令格式如下EXIT|要离开的用户名|EXIT的参数是要离开的用户名。当聊天室服务器接受到该命令后,会清除该用户的一些记录和数据

8、,然后向该客户端发送QUIT命令,表示用户已经离开。QUIT命令的格式如下QUIT|客户端收到该命令后,知道服务器已经进行了一些处理,此时可以把链接状态变为CLOSED状态。2.2系统运行环境Microsoft visual studio 2010三、系统详细设计(包括程序模块、流程、主要函数等) 3.1 聊天室服务器模块 聊天室程序主要包括服务器和客户端建立连接模块、通信模块、和关闭连接模块 聊天室服务器是聊天室的主体,所以应该首先创建聊天室服务器,只有建立了聊天室服务器,客户才能连接到上面,从而进行聊天。服务器建立之后,一般处于监听状态,等待客户机的连接申请。聊天室服务器的设计界面如下:

9、“当前在线用户”文本框显示了当前登陆到聊天室的客户数,“socket端口号”文本框用于输入聊天室服务器监听的端口号。“Socket停止”按钮用于停止聊天室服务器。下部左侧的列表框用于显示所有登录的用户,右边的Richtextbox用于显示所有的聊天信息、系统消息等。3.2 聊天室客户端模块 聊天室客户端主要是好用户进行交互的,其界面设计如下所示:聊天室客户端的各个控件的功能如下所示:“服务器地址”文本框:用于输入聊天室服务器的ip地址或者是聊天室服务器的机器名字等“端口号”文本框:聊天室服务器进行监听的端口号“用户名”文本框:登录聊天室服务器的用户名。如果为空,单击“登录”按钮时会提示用户输入

10、用户名。“登录”按钮:单击该按钮会连接到聊天室服务器。“离开“按钮:单击该按钮会退出聊天室服务器。”当前在线用户列表”列表框:显示当前在线的全部用户,列表中给出了这些用户的名字。“系统信息”Richtextbox:显示聊天信息、系统消息等。“悄悄话”复选框:选择该按钮后,只向某个选择的用户发送信息,其他用户看不到这些信息。“发送”按钮:用于发送聊天信息“颜色”按钮:用于设置聊天信息或者系统信息的颜色。3.3 聊天室服务器的协议解析流程 聊天室服务器的数据接收流程图从图中可以看出,当有客户端连接聊天室服务器后,服务器立刻为这个客户建立一个数据接收的独立线程。在接收线程中,如果接收到了聊天命令,就

11、对其进行解析处理。 服务器接收到CONN命令,就向其他用户发送JOIN命令告诉有用户加入,然后把当前的全部用户信息返回到刚刚加入的用户,以便于该用户在界面上显示用户列表。当接收到命令后,就清楚当前用户的信息,然后向其他用户发送命令,告诉其他用户有用户退出了,这些用户的客户端会把离开的用户从用户列表中删除。3.4 聊天室客户端的协议解析流程 从图中可以看出,当客户端连接到服务器后,服务器立刻建立一个数据接收的独立线程。在接收线程中,如果收到了聊天命令,就对其进行解析处理。聊天室客户端一共处理的命令有五种:OKERRLISTJOINQUIT命令。 当接收到QUIT命令后,客户端就将已经离开的用户从

12、用户列表中清楚。如果不是这几种命令,就表示普通的信息,需要把信息输出到界面上。四、程序源代码及注释系统的主要功能有用户显示,公共聊天,私人聊天,系统信息等。下面分别介绍服务器和客户端的实现方法。服务器端设计ChatServer.cs文件中包含了ClientServerForm类和Client类,其中ClientServerForm类是实现聊天室服务器的主要类,它封装了聊天室服务器的基本操作。下面对服务器端实现代码进行介绍:类和成员定义以及构造函数ClientServerForm中引用了两个与网络操作相关的命名空间:System.Net和System.Net.Sockets。2)获得有效的端口号

13、和IP地址下面的代码用于获得本地局域网或者拨号动态分配的IP地址。在启动聊天室服务器时,会用到这些IP地址。private string getIPAddress()/ 获得本机局域网IP地址 IPAddress AddressList = Dns.GetHostByName(Dns.GetHostName().AddressList;if (AddressList.Length1)return ;return AddressList0.ToString(); private static string getDynamicIPAddress( )/ 获得拨号动态分配IP地址IPAddress

14、 AddressList = Dns.GetHostByName(Dns.GetHostName().AddressList;if (AddressList.Length2)return ;return AddressList1.ToString();聊天室服务器监听的端口号时通过getVaidPort函数获得。通过System.Convert.ToInt32(port)语句尝试把用户输入的端口号转换为整型值。private int getValidPort(string port)int lport;/测试端口号是否有效try/是否为空if (port=) throw new Argumen

15、tException(端口号为空,不能启动服务器);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)启动聊天室服务器/当单击“Socket启动”按钮时,便开始监听指定的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)处理聊天命令服务器处理聊天命令时,需要向客户端发送命令或者发送响应信息。这些命令的发送都是通过SendToClient()函数实现的。/SendToClient()方法实现了向客户端发送命令请求的功能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);以上代码主要是用于服务器初始化和接收客户端发送来的数据。4.2 客户端设计 聊天室客户端主要包含在文件ChatClient.cs文件中,该文件中包含了一个类ChatClientForm,该类中封装了聊天室客户端界面和聊天命令处理逻辑。下面介绍这个类中主要功能的实现方法。连接聊天室服务器聊天室客户端启动后,单击“登入”按钮会执行下面的代码连接聊天室服务器。程序首先检查是否已经是CONNECTED状态

19、,如果是就退出。然后检查用户是否输入了用户名,如果没有就显示一个对话框,提示用户应该输入用户名。最后通过TcpClient方法连接聊天室服务器并发送CONN消息命令。/连接聊天服务器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/创建一个客户端套接字,它是Login的一个公共属性,/将被传递给ChatClient窗体tcpClient=new TcpClient();/向指定的IP地址的服务器发出连接请求tcpClient.Connect(IPAddress.Parse(txtHost.Text),Int32.Parse(txtPort.Text);/获得与服务器数据交互的流通道(NetworkStream)Stream=tcpClient.GetStream();/启动一个新的线程,执行方法this.ServerResponse(),/以便来响应从服务器发回的

21、信息Thread thread=new Thread(new ThreadStart(this.ServerResponse);thread.Start();/向服务器发送“CONN”请求命令,/此命令的格式与服务器端的定义的格式一致,/命令格式为:命令标志符(CONN)|发送者的用户名|string cmd=CONN|+this.tbUserName.Text+|;/将字符串转化为字符数组Byte outbytes=System.Text.Encoding.Default.GetBytes(cmd.ToCharArray();Stream.Write(outbytes,0,outbytes.

22、Length);catch(Exception ex)MessageBox.Show(ex.Message); 发送聊天信息 在连接到聊天室服务器后,用户就可以输入聊天信息了。输入完毕单击“发送”按钮时,便会进入btnSend_Click处理程序。在btnSend_Click处理程序中,如果不是私聊,就把“CHAT”命令发送给服务器,否则(为私聊),就把“PRIV”命令发送给服务器。/注意命令格式一定要与服务器端的命令格式一致private void btnSend_Click(object sender, System.EventArgs e)tryif(!this.cbPrivate.Ch

23、ecked)/此时命令的格式是:/命令标志符(CHAT)|发送者的用户名:发送内容|string message=CHAT|+ this.tbUserName.Text +:+tbSendContent.Text+|;tbSendContent.Text=;tbSendContent.Focus();/将字符串转化为字符数组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();/消息的格式是:/命令标志符(PRIV)|发送者的用户名|接收者的用户名|发送内容|string message=PRIV|+this.tbUserName.Text+|+receiver+|+tbSendContent.Text+|;tbSendContent.Text=;tbSendContent.Focus();/将字符串转化为字符数组byte outbytes=System.Text.Encoding.ASCII.GetBytes(message.ToCharArray();Stream.Write(outb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论