当前位置:文档之家› 基于Socket的聊天室

基于Socket的聊天室

基于Socket的聊天室
基于Socket的聊天室

设计报告

课程

设计名称基于Socket的聊天室专业班级

同组人姓名

同组人学号

实验日期

指导教师

成绩

年月日

一、设计目的和要求

1、实验目的

网络聊天系统主要对象是局域网内的用户,使用交流更简单。设计本系统的目标如下:

(1)一台电脑上能够同时登陆多个不同的用户。

(2)进入聊天页面后用户在用户列表中可以看到在线用户。

(3)用户登陆成功后如果需要私聊可以在界面中勾选“悄悄话”选择框进行私聊。

(4)若用户需要群聊,可以在好友列表中选择所有人进行群聊。

2、实验要求

可以实现用户显示、公共聊天、私人聊天、系统消息提示等功能。

二、设计说明(包括设计分析,系统运行环境,设计中的重点和难点,输入和输出输出条件等)

聊天室主要由聊天室服务器和聊天室客户端组成。聊天室服务器负责管理与客户端的连接并发送消息给客户端;聊天室客户端负责接收或者发送聊天消息,登录聊天室服务器等。一个简单的服务器/客户机聊天室模型如图:

聊天室客户端(商用PC)

服务器

聊天室客户端

(其他)

聊天室客户端(笔记

本)

其他服务器

1.首先启动聊天室服务器,使得TcpListener开始监听端口,此时

TcpListener会进入Pending状态,等待客户端连接;

2.其次,当有客户端连接后,通过AccepSocket返回与客户端连接的Socket 对象,然后通过读写Socket对象完成与聊天室客户端的数据传输。聊天室客户端成功启动后,首先创建一个Socket对象,然后通过这个Socket对象连接聊天室服务器,连接成功后开通Socket完成数据的接收和发送处理。

聊天室服务器和聊天室客户端消息的传递是这样进行的:

2.1聊天协议的应答:

聊天命令

客户端服务器

OK /ERR应答信号

在本聊天协议中只定义了两种应答:OK和ERR。客户端收到OK应答时,表示前面发送的聊天命令执行成功;收到ERR应答时,表示前面发送的聊天命令执行失败;

2.1.1聊天状态:

聊天状态:CLOSED和CONNECTED状态。当执行CONN命令后就进入CONNECTED状态。只有在这个状态下才可以执行以下的聊天命令:

CONN:连接聊天室服务器

JOIN:加入聊天(通知其他用户本人已经加入聊天室服务器)

LIST:列出所有的用户(向客户端发送全部的登录用户名字)

CHAT:发送聊天信息(公开的聊天信息)

PRIV:进行私聊(三个参数:私聊信息用户;接收私聊信息用户;发送信息)

EXIT:客户端向服务器发送离开请求;

QUIT:退出聊天,服务器向客户端发送退出命令(执行QUIT命令聊天状态变为CLOSED)

在执行了QUIT命令后,聊天状态就会变为CLOSED的状态,此时客户端只能执行CONN命令再次登录聊天室服务器。

2.1.2 聊天命令

聊天命令主要有:CONN,JOIN,LIST,CHAT,PRIV和QUIT,下面分别介绍这些命令的定义和格式。

1)CONN命令:

CONN命令连接聊天室服务器。当聊天室客户端和聊天室服务器建立了

Socket连接后,会马上发送CONN命令。其命令格式如下:

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

CONN的参数为发送者的用户名,一般是用户用于聊天的昵称。如果昵

称已经存在,就发送ERR命令,否则就发送OK命令。下面是两个CONN

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

程:

CONN|tom|

-ERR|USER TOM ALREADY EXISTS

CONN|tom|

_OK

2)JOIN命令

JOIN命令用于通知用户加入聊天聊天室服务器。当一个用户登录到聊天室服务器后,服务器会发发送JOIN命令通知其他用户有新用户入聊天室服务器。JOIN的命令格式如下:

JOIN|XXXX|

JOIN的参数为刚刚登录到聊天室服务器的用户名,该命令可以不需要用户端的响应,客户端接收到该命名后一般就是更新界面,显示XXX已经加入聊天室。对于刚刚加入的用户,其状态会在收到JOIN命令后变为CONNECTED状态。

3)LIST命令

LIST命令用于向聊天室客户端发送全部的登录用户名字,以便于用户聊

天室客户端上选择用户进行私聊。LIST命令的命令格式如下:

LIST\USERNAME 1| USERNAME2|….| USERNAMEX|

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

4)CHAT命令

CHAT命令用于向所有用户发送聊天信息,这是公开的聊天信息其命令格式如下:

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

CHAT命令的参数有两个,前面的是发送者的用户名,后面的是发送内容。客户端收到该命令后不需要进行如何处理,只有把信息显示在界面上即可。

5)PRIV命令

PRIV命令是进行私聊的命令和CHAT命令不同,通过RPIV命令传输的信息智能veil接受用户看到。PRIV命令的格式如下

PRIV|发送者的用户名|接受者的用户名|发送内容|

PRIV命令有三个参数,第一个是发送私聊信息的用户,第二个是接收私聊信息的用户,第三个是发送的信息。

6)QUIT和EXIT命令

EXIT命令是客户端向服务器发送离开请求,其命令格式如下

EXIT|要离开的用户名|

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

QUIT|

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

2.2系统运行环境

Microsoft visual studio 2010

三、系统详细设计(包括程序模块、流程、主要函数等)

3.1 聊天室服务器模块

聊天室程序主要包括服务器和客户端建立连接模块、通信模块、

和关闭连接模块

聊天室服务器是聊天室的主体,所以应该首先创建聊天室服务器,只有建立了聊天室服务器,客户才能连接到上面,从而进行聊天。服务器建立之后,一般处于监听状态,等待客户机的连接申请。聊天室服务器的设计界面如下:

“当前在线用户”文本框显示了当前登陆到聊天室的客户数,“socket端口号”文本框用于输入聊天室服务器监听的端口号。“Socket停止”按钮用于停止聊天室服务器。下部左侧的列表框用于显示所有登录的用户,右边的Richtextbox用于显示所有的聊天信息、系统消息等。

3.2 聊天室客户端模块

聊天室客户端主要是好用户进行交互的,其界面设计如下所示:

聊天室客户端的各个控件的功能如下所示:

“服务器地址”文本框:用于输入聊天室服务器的ip地址或者是聊天室服务器的机器名字等

“端口号”文本框:聊天室服务器进行监听的端口号

“用户名”文本框:登录聊天室服务器的用户名。如果为空,单击“登录”按钮时会提示用户输入用户名。

“登录”按钮:单击该按钮会连接到聊天室服务器。

“离开“按钮:单击该按钮会退出聊天室服务器。

”当前在线用户列表”列表框:显示当前在线的全部用户,列表中给出了这些用户的名字。

“系统信息”Richtextbox:显示聊天信息、系统消息等。

“悄悄话”复选框:选择该按钮后,只向某个选择的用户发送信息,其他用户看不到这些信息。

“发送”按钮:用于发送聊天信息

“颜色”按钮:用于设置聊天信息或者系统信息的颜色。

3.3 聊天室服务器的协议解析流程

启动聊天服务器

启动监听器

等待

接收客户端连接

启动客户数据接收线程

保持连接并且SocketServiceFlag为true?

退出线程

读取数据

解析命令

CONN命令CHAT命令

LIST命令EXIT命令

PRIV命令

向全部用户发

送JOIN命令

向当用户发送LIST命令向当用户发送

LIST命令

向当用户发送

CHAT命令

向接收者发送

数据

向发送者发送

数据

向全部用户发

送QUIT命令

删除用户数据

休息200毫秒

聊天室服务器的数据接收流程图

从图中可以看出,当有客户端连接聊天室服务器后,服务器立刻为这个客户建立一个数据接收的独立线程。在接收线程中,如果接收到了聊天命令,就对其进行解析处理。

服务器接收到CONN命令,就向其他用户发送JOIN命令告诉有用户加入,然后把当前的全部用户信息返回到刚刚加入的用户,以便于该用户在界面上显示用户列表。当接收到EXIT命令后,就清楚当前用户的信息,然后向其他用户发送QUIT命令,告诉其他用户有用户退出了,这些用户的客户端会把离开的用户从用户列表中删除。

3.4 聊天室客户端的协议解析流程

Socket

Connect

启动客户数据接收线程

是停止标志吗?

退出线程

读取数据

解析命令

OK 命令

LIST 命令

ERR 命令

QUIT 命令

JOIN 命令

命令执行成功

命令执行失败

显示全部用户

显示用户加入

显示用户离开

删除用户数据

休息200毫秒

启动聊天室客

户端

No

Yes

其他情况

直接显示用户信息

从图中可以看出,当客户端连接到服务器后,服务器立刻建立一个数据接收的独立线程。在接收线程中,如果收到了聊天命令,就对其进行解析处理。聊天室客户端一共处理的命令有五种:OK\ERR\LIST\JOIN\QUIT 命令。

当接收到QUIT 命令后,客户端就将已经离开的用户从用户列表中清楚。如果不是这几种命令,就表示普通的信息,需要把信息输出到界面上。

四、程序源代码及注释

系统的主要功能有用户显示,公共聊天,私人聊天,系统信息等。下面分别介绍服务器和客户端的实现方法。

1. 服务器端设计

ChatServer.cs 文件中包含了ClientServerForm 类和Client 类,其中ClientServerForm 类是实现聊天室服务器的主要类,它封装了聊天室服务器的基本操作。下面对服务器端实现代码进行介绍:

1)类和成员定义以及构造函数

ClientServerForm中引用了两个与网络操作相关的命名空间:

https://www.doczj.com/doc/5516940534.html,和https://www.doczj.com/doc/5516940534.html,.Sockets。

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

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

聊天室服务器时,会用到这些IP地址。

private string getIPAddress()

{

// 获得本机局域网IP地址

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();

}

聊天室服务器监听的端口号时通过getVaidPort函数获得。通过

System.Convert.ToInt32(port)语句尝试把用户输入的端口号转换为整型值。

private int getValidPort(string port)

{

int lport;

//测试端口号是否有效

try

{

//是否为空

if (port=="")

{

throw new ArgumentException(

相关主题
文本预览
相关文档 最新文档