C#课程设计简单的聊天室工具系统

郑州科技学院C#课程设计论文

题目:简单的聊天室工具

院系:信息工程学院

专业:计算机科学与技术

班级:10计科二班

姓名:李海朋

学号:201015050

日期:2013-5-30

摘要

随着网络的出现,信息资源的实时共享成为现实,更重要的是它提供了一种极为直接的交互方式,当然这种交互不单是指数据、信息之间的传递,也包括人与人之间的互相交流,各种聊天软件和在线聊天室正是承载这类交互的媒介。简单的聊天室工具程序是一种比较流行色C/S模式的聊天工具设计,基于C#进行程序的简单设计。C/S(Client/Server,客户机/服务器)模式又称C/S结构,是软件系统结构的一种。C/S模式简单的讲就是基于企业内部网络的应用系统。与B/S(Browser/Server,浏览器/服务器)模式相比,C/S模式的应用系统最大的好处是不依赖企业外网环境,即无论企业是否能上网都不影响使用(基于局域网)。简单的聊天室工具主要聊天室客户端和聊天室服务器组成。其中聊天室服务器负责管理与客户端的连接并发送消息给客户端,聊天室客户端负责接收或者发送聊天信息、登陆聊天室服务器等。

关键技术Socket,所谓Socket通常也称为“套接字”,它是通信的基础,用于描述IP地址和端口,一个套接字是通信的一端,在这一端上可以找到与其对应的一个名字,一个正在被使用的套接字都有它的类型和与其相关的进程。套接字存在于通信域。通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可以穿越域的界限,但是这时需要执行莫种解释程序)。它也可以说是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。研究人员为TCP/IP网络通信开发了一个API (应用程序接口)。这个API称为Socket接口(套接字)。

目录

1概述 (4)

1.1开发背景 (4)

1.1.1 各种聊天工具的兴起 (4)

1.1.2本系统开发环境 (5)

1.1 C#语言的发展 (5)

2 C/S聊天模型设计 (6)

2.1 服务器/客户端聊天模型 (6)

2.2 服务器/客户端消息传递模型 (7)

3聊天协议 (8)

3.1关于聊天协议的应答 (8)

3.2 聊天状态处理 (9)

3.3 聊天命令介绍 (9)

3.3.1 CONNECT命令 (9)

3.3.2 JOIN命令 (10)

3.3.3 LIST命令 (10)

3.3.4 CHAT命令 (11)

3.3.5 PRIV命令 (11)

3.3.6 EXIT和QUIT命令 (11)

4 系统功能定义 (12)

4.1 聊天工具服务器 (12)

4.2 聊天工具客户端 (13)

5 系统功能设计 (14)

5.1聊天工具服务器的协议解析流程图 (14)

5.2聊天工具客户端的协议解析流程 (16)

6系统功能实现 (17)

6.1 服务器端程序设计 (17)

6.1.1类和成员定义的以及构造函数 (17)

6.1.2获得有效的端口号和IP地址 (18)

6.1.3启动聊天工具服务器 (20)

6.1.4关于ChatClient类的定义 (23)

6.1.5聊天命令的处理 (24)

6.2客户端程序设计 (31)

6.2.1类的成员定义及构造函数 (31)

6.2.2与聊天工具服务器的连接 (32)

6.2.3聊天信息的发送 (34)

6.2.4聊天命令处理 (36)

6.2.5退出聊天 (39)

7 聊天工具程序的运行与测试 (40)

总结 (44)

参考文献 (45)

1概述

1.1开发背景

1.1.1 各种聊天工具的兴起

随着网络的出现,信息资源的实时共享成为现实,更重要的是它提供了一种极为直接的交互方式,当然这种交互不单是指数据、信息之间的传递,也包括人与人之间的互相交流,各种聊天软件和在线聊天室正是承载这类交互的媒介。随着互联网的发展,人们通过网络可以更方便快捷地进行信息交流和学习,聊天系统可以为大家提供一个更好的交流平台,在这个平台上,人们可以通过文字与符号进行实时的交谈、聊天,它是一个向整个因特网开放的地方,是提供给网民一个交友与娱乐的场所,在聊天室里网民可选择自已的聊天对象,与其进行对话交流,是网民之间相互沟通、交流情感的最佳方式之一。同时它已成为各网站提供的一个服务标准,是吸引网民,提高人气的一个重要方式。

目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSN Messenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作

伙伴,可以实时交谈和互传信息。而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为Live Messenger)以及跨平台Gaim等。

1.1.2本系统开发环境

基于本学期《C#课程设计》课程的学习和期末课程设计的需要,在技术相对成熟的前提下开发的简单聊天工具。当然只是基于本课题的程序设计—简单的聊天工具,与当今各大公司开发的聊天工具相差较远,技术相对比较落后,只是着眼与本课程设计。

1.1 C#语言的发展

C#,读做 "C sharp",中文译音暂时没有.专业人士一般读"C sharp",由C和C++衍生出来的面向对象的编程语言。它在继承C 和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和

C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选

语言。C#语言是https://www.360docs.net/doc/6717137427.html,框架重点推出的语言,具备C++语言的安全性能和VB语言的快速开发特点,简单的说,C#其实就是一种基于https://www.360docs.net/doc/6717137427.html,平台上的一种编程开发语言,同时它也是目前最流行的开发语言之一。

C#的特点包括了诸如单一继承、界面、与Java 几乎同样的语

法,和编译成中间代码再运行的过程。但是C#与Java 有着明显

的不同,它借鉴了Delphi 的一个特点,与COM(组件对象模型)是

直接集成的,而且它是微软公司.NET windows 网络框架的主角。

2 C/S 聊天模型设计

2.1 服务器/客户端聊天模型

聊天工具主要有聊天室客户端和服务器组成,其中聊天室负责

管理与客户端的连接并发送消息给客户端;聊天室客户端负责接

收或者发送聊天信息、登陆聊天室服务器等。一个聊天工具支持

多个聊天客户端进行同时连接,聊天室服务器和聊天室客户端之

间根据协议进行通信,目前许多著名的聊天协议都采用这种模式,

但实例定义了一个简单的聊天协议,聊天室服务器和客户端按照

协议进行

通信。

平板电脑页 1服务器/客户端聊天室模型

2013年6月3日

平板电脑

2.2 服务器/客户端消息传递模型

首先启动聊天室服务器,使得TcpListener开始监听端口,此时TcpListener会进入Pending状态,等待客户端连接;其次,当有客户端连接后,通过AccepSocket返回与客户端连接的Socket 对象,然后通过读写Socket对象完成与聊天室客户端的数据传输。聊天室客户端成功启动后,首先创建一个Socket对象,然后通过这个Socket对象连接聊天室服务器,连接成功后开通Socket 完成数据的接收和发送处理。

服务器/客户端消息传递模型

3聊天协议

主机与主机通信主要识别身份(IP 地址和端口号)及通信协议

网络应用程序 端口号 接收数据

注:1.IP 地址是总机,端口号是分机(传输层)

2.端口号为16位二进制数,范围0到65535,但实际编程只

能用1024以上端口号

3.1关于聊天协议的应答

在聊天协议中每个聊天命令都是应答的方式,即客户端发送

聊天命令后会接收到每一个应答消息。为了简化操作,在实例聊

天协议中只定义了OK 和ERROR 两种应答。客户端收到OK 应

答时,表式前面的聊天命令已经执行成功;收到ERROR 应答时,

表式前面发送的聊天命令执行失败。

应答使用文字字符串“OK ”和“ERROR ”表式,因此接收到

数据后直接惊醒判断即可,这样可以简化程序的实现。应答

ERROE 后面可以跟参数表式失败的原因,格式如下:

ERROR:|出错原因

3.2 聊天状态处理

在整个聊天室的聊天过程中,客户端包括closed和connected两种状态。当执行CONNECT命令后就进入connected 状态,只有在这个状态下才可以执行以下的聊天命令:

JOIN:加入聊天

LIST:列出所有用户

CHAT:发送聊天命令

PRIV:进行聊天

QUIT:退出聊天

在执行QUIT命令后,聊天状态就会变为closed状态,此时客户端只能执行CONNECT命令再次登陆聊天室服务器。

3.3 聊天命令介绍

聊天命令主要包括CONNECT、JOIN、LIST、CHAT、PRIV 和QUIT。下面是关于这些命令的定义以及命令格式的相关介绍。

3.3.1 CONNECT命令

CONNECT用于连接聊天会服务器。当聊天工具客户端与聊天工具服务器端建立了Socket连接后,会马上发送CONNECT命令。其命令格式如下:

CONNECT|发送者的用户名:附件信息|

CONNECT的参数为发送者的用户名,一般是用户用于聊天的昵称。如果昵称存在了,就发送ERROR应答,否者发送OK应答。

下面是CONNECT的连接过程。

CONNECT|Mike|

-ERROR|User Tom already exists

CONNECT|Mike|

-OK

其中,第一个是失败的连接过程,第二个是成功的连接过程。

3.3.2 JOIN命令

JOIN用于通知其他用户本人已经加入聊天工具的服务器。当一个用户登陆到聊天工具服务器后,服务器会发送JOIN命令通知每个聊天工具客户端有新用户加入。JOIN命令格式如下:JION | XXXXX |

JOIN的参数为刚刚登陆到聊天工具服务器的用户名,该命令可以不需要客户端的响应,客户端接收到改命令后一般就是更新界面,显示XXXXX已经进入聊天工具。对于刚刚加入的用户选择用户,其状态在收到JOIN命令后变为connected状态。

3.3.3 LIST命令

LIST命令用于向聊天室客户端全部的登陆用户的用户名,以便于用户在聊天工具客户端选择用户进行私聊。LIST命令格式如下:

LIST|user1|user2|……|user N|

LIST命令的参数可以有很多,用户可以用“|”分开。客户端收到该命令以后会解析命令参数,并把这些用户显示在界面上。

3.3.4 CHAT命令

CHAT命令用于向所有用户发送聊天消息,这是公开的聊天消息,其命令格式定义为

CHAT|发送者的用户名:发送内|

3.3.5 PRIV命令

PRIV是私聊命令。同CHAT命令不同,通过PRIV命令传输的信息只能被接收者看到。PRIV的命令格式如:

PRIV | 发送者用户名|接收者用户名|发送内容|

3.3.6 EXIT和QUIT命令

EXIT命令是客户端发送给聊天工具服务器的,表示当前用户要退出聊天工具。EXIT格式如下:

EXIT | 要离开的用户名|

EXIT的参数是“要离开的用户名“。当聊天工具服务器收到该命令后,会清除一些记录和数据,然后向客户端发送QUIT命令,表示用户已经离开。QUIT命令的格式为:

QUIT |

客户端收到QUIT命令后,知道服务器已经进行了一些处理,此时可以把连接状态变为closed状态。

4 系统功能定义

C/S聊天工具提供了最基本的聊天功能,如聊天、用户列表维护等。在开发聊天程序之前,首先需要定义号程序所要实现的功能,根据聊天工具的实际需要,一个聊天工具的主要由聊天工具服务器和聊天工具客户端组成,下面分别介绍这两个部分的具体系统功能定义。

4.1 聊天工具服务器

聊天工具服务器是聊天工具重要的一部分,是聊天工具的主体,所以应该首先创建聊天工具服务器,只有存在了聊天工具的服务器客户端以后,客户端才能与其正常连接,从而实现聊天功能。服务器建立完成以后,一般情况下,服务器端都处于监听状态,等待客户端的连接请求。聊天工具服务器界面如下图所示:

服务器端口文本框用于输入聊天工具服务器需要进行监听的端口号。开启服务器按钮用于启动聊天工具服务器,开始进行监

听。停止服务器按钮用于停止聊天工具服务器。下部左侧的列表框用于显示在线用户列表,右边的RichTextBox控件用于显示系统信息及聊天信息等消息。在下方的状态栏的Lable控件用于显示在线人数。

4.2 聊天工具客户端

聊天工具客户端主要用于和用户交互的,其界面如下图所示。聊天工具客户端中各个控件的功能如下:

●【服务器】文本框:用于输入聊天工具服务器的IP地址

或者是聊天工具的机器名称。

●【端口】文本框:聊天工具服务器进行监听的端口号。

●【用户名】文本框:用于登录聊天工具服务器的用户名。

如果为空,则不允许登录,再单击【登录】按钮时会提

示用户输入用户名。

●【聊天内容】文本框:用于显示聊天信息、系统信息。

●【发送信息】文本框:用于输入聊天内容,单击【发送】

按钮会发送信息。

●【发送】按钮:用于发送聊天信息。

●【私聊】复选框:选中以后,用于向选中的用户发送悄悄

话。

●【离开聊天】按钮:单击该按钮离开聊天工具服务器。

5 系统功能设计

从前面的介绍可以看到,聊天工具服务器和聊天工具客户端之间的协议解析和执行时最重要的内容。为此,下面将基于上一节的功能定义,给出聊天工具服务器程序实现聊天协议的解析流程和聊天工具客户端实现聊天协议解析的流程图。

5.1聊天工具服务器的协议解析流程图

聊天工具服务器实现聊天协议的解析流程如下图所示。从图中可以看出,当聊天工具客户端连接聊天工具服务器后,服务器

将为这个客户端建立一个数据接收的独立线程。

注意:对于多用户的聊天工具服务器,这是非常必要的。在接收线程中,如果接收到了聊天命令就对它进行解析处理。聊天工具服务器就可以处理CONNECT、LIST、CHAT、PRIV、EXIT5种类型的命令。

服务器接收到CONNECT命令以后,就向其他客户端发送JOIN命令,告诉其他用户有新的用户加入,然后把当前的全部用户信息返回给刚刚加入的用户,以便于用户在界面上显示用户列表。当接收到EXIT命令后,就删除当前用户的信息,然后向其他用户发送 QUIT命令,告诉其他用户有用户退出了,这些用户的客户端会把离开的用户从用户列表中删除。这就是聊天工具服务器的解析流程的文字描述。

5.2聊天工具客户端的协议解析流程

当聊天工具客户端连接到聊天工具服务器以后,聊天工具服务器立刻建立一个数据接收的独立线程。在接收线程中,如果接收到了聊天命令,客户端就对其进行解析处理。聊天工具客户端将会处理OK、ERROR、LIST、JOIN和QUIT5种命令,聊天工具客户端的数据接收流程图如图所示。

当接收到QUIT命令以后,聊天工具客户端就将已经离开的用户从用户列表中删除。如果不是这几种命令,就表示普通的信息,此时会直接将其输出到界面上。

6系统功能实现

在定义了应用程序的功能和实现了系统设计后,将介绍如何编码实现一个基于Socket的C/S模式的聊天程序。该聊天系统的主要功能有用户显示、公共聊天、私人聊天、系统消息等。下面分别从聊天工具的服务器和客户端两个方面介绍其实现方法。

6.1 服务器端程序设计

frmServerMain.cs文件中包含了frmServerMain和ChatClient 两个类,其中frmServerMain类实现聊天工具服务器端的主要类,它封装了聊天工具服务器端的基本操作。关于聊天工具服务器端的实现代码介绍如下。

6.1.1类和成员定义的以及构造函数

namespace jiandan_A

{

public partial class frmServerMain : Form

{

internal static Hashtable clients = new Hashtable();//client数组保

存当前在线用户的client对

private TcpListener listener; //该服务器默认的监听器

static int MAXUSER = 100; //默认最大支持的客户端连接数

internal static bool ServerFlag = false; //服器是否开启的志

public frmServerMain()

{ InitializeComponent(); }

public delegate void AppendMsgEventHandler(RichTextBox rb, string msg);

//定义在线程中操作不同线程创建的控件的委托

public delegate void AppendUserEventHandler(ListBox lb, string username);

其中,静态变量clients是一个基于HashTable对象,用于保

存当前在线的用户数据,listener是一个TcpListener对象,用于监

听默认端口,我们看以下MSDN中对TcpListener类的介绍:

TcpListener类提供一些简单的方法,用于在阻止同步模式下

侦听和接收传入连接请求。可使用TcpListener和Socket来连接

TcpListener。可使用IPEndPoint、本地IP地址及端口号或者仅使

用端口号来创建TcpListener。可以将本地IP地址指定为Any,将

本地端口号指定为0(如果希望基础服务提供程序为您分配这些

值)。如果选择这样做,可以在连接套接字后使用LocalEndpoint

属性来标识已指定的信息。

MAXUSER常量定义了服务器可以接受的用户的最大数目,

也就是说,当服务器端接收的客户端连接超过这个数目时就会拒

绝接收连接请求。ServerFlag用于表式是否已经开始监听Socket

连接请求,当ServerFlag为False时,将断开所有客户的连接。

6.1.2获得有效的端口号和IP地址

下面的代码用于获得本地局域网或者拨号动态分配的IP地

址,在启动聊天工具服务器时,需要用到这些IP地址。

private string returnIpAddress()

{

IPAddress[] AddressList =

Dns.GetHostByName(Dns.GetHostName()).AddressList;

if (AddressList.Length < 1)

{ return""; }

return AddressList[0].ToString(); }

private static string getDynamicIPAddress()//获得拨号动态分配IP地址

{

IPAddress[] AddressList =

Dns.GetHostByName(Dns.GetHostName()).AddressList;

if (AddressList.Length < 2)

{ return""; }

return AddressList[1].ToString(); }

聊天工具服务器监听的端口号是通过returnValidPort()函数验证获取的。在这个函数中,函数先验证输入的信息是否为空:如果为空,就抛出一个ArgumentException异常,异常信息提示为“端口号为空,不能启动服务器!”,并且置【启动服务器】按钮的Enable属性为false,使用户不能对它进行单击等操作;如果不为空,就继续检测用户输入的端口号是否合法,即通过“Convert.ToInt32(tbServerPort.Text.Trim())”语句尝试把用户输入的端口号转换为整数值。如果用户输入正确,函数会返回已经转换为整数的端口号:否则返回小于0的值。returnVallidPort()函数代码如下

private int returnValidPort(string strPort) //获取有效的端口号

{ int port;

try //测试端口号是否有效

{ if (tbServerPort.Text == "")

{ throw new ArgumentException("端口号为空,不能启动服务器!");} else{

port = Convert.ToInt32(tbServerPort.Text.Trim());}

}

catch (Exception ex)

{

this.rbChatContent.AppendText("无效的端口号:" + ex.Message + "\n");

return -1; }

return port;

}

6.1.3启动聊天工具服务器

在聊天工具服务器端界面图中,当用户单击【启动服务器】按钮时执行以下代码来启动聊天工具服务器,并监听指定的Socket端口。监听程序是单独在一个线程中实现的,这样可以不影响界面的正常操作。

//开启服务器

private void btStartServer_Click(object sender, EventArgs e)

{ int iPort = this.returnValidPort(tbServerPort.Text.Trim());

if (iPort < 0)

{ MessageBox.Show("错误的端口信息!", "错误提示");

return }

string ip = this.returnIpAddress();

相关文档
最新文档