基于Socket的聊天室C#版.docx

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、服务器 / 客户端聊天室模型

聊天室客户端

(其他)

聊天室客户端(笔记

本)聊天室客户端(商用PC)

服务器

其他服务器

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

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

2.其次,当有客户端连接后,通过AccepSocket返回与客户端连接的Socket

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

二、系统功能设计

本设计为一个简单的聊天室工具,设计基本的聊天功能,如聊天、列表维护等。

系统主要为两大块:聊天室服务器及聊天室客户端。

服务器界面设计如下:

客户端界面设计如下:

三、聊天协议的应答A—网络—

B

主机与主机通信主要识别身份(标识设备用IP)及通信协议

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

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

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

上端口号

Socket 编程

首先,我们了解常用网络编程协议。我们用得最多的协议是UDP 和 TCP,UDP 是不可靠传输服务, TCP 是可靠传输服务。 UDP 就像点对点的数据传输一样,

发送者把数据打包,包上有收信者的地址和其他必要信息,至于收信者能不能收到, UDP 协议并不保证。而TCP 协议就像 (实际他们是一个层次的网络协议)是建立在 UDP 的基础上,加入了校验和重传等复杂的机制来保证数据可靠的传达

到收信者。一个是面向连接一个无连接,各有用处,在一些数据传输率高的场合

如视频会议倾向于UDP ,而对一些数据安全要求高的地方如下载文件就倾向于TCP。

Socket ————网络应用程序

电话机————访问通信协议

聊天协议的应答:

聊天命令

客户端服务器

OK /ERR 应答信号

聊天状态: CLOSED 和 CONNECTED 状态

执行 CONN 命令后进入 CONNECTED 状态,执行下列命令:

CONN: 连接聊天室服务器

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

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

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

PRIV:进行私聊(三个参数:私聊信息用户;接收私聊信息用户;发送信息)EXIT:客户端向服务器发送离开请求;

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

四、系统实现

服务器协议解析:

当有客户端连接聊天室服务器后,服务器立刻为这个客户建立一个数据接收

的线程(多用户程序必备)。在接收线程中,如果收到聊天命令,就对其进行解

析处理,服务器可以处理五种命令:CONN\LIST\CHAT\PRIV\EXIT。

服务器接收到 CONN 命令,就向其他用户发送JOIN 命令告诉有用户加入,然后把当前的全部用户信息返回给刚刚加入的用户,以便在界面上显示用户列

表。当接收到 EXIT 命令后,就清除当前用户的信息,然后向其他用户发送QUIT 命令,告诉其他用户退出了,这些用户的客户端把离开的用户从用户列表中删除。

启动聊天服务器

启动监听器

等待

接收客户端连接

启动客户数据接收线程

保持连接并且SocketServiceFlag为 true ?

退出线程

读取数据

解析命令

CONN命令LIST命令CHAT命令PRIV 命令EXIT命令

向全部用户发向接收者发送

删除用户数据

送 JOIN命令向当用户发送向当用户发送数据

LIST命令CHAT命令

向当用户发送向发送者发送向全部用户发

LIST命令数据送 QUIT命令

休息 200毫秒

聊天室客户端的协议解析:

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

启动聊天室客

户端

Socket

Connect

启动客户数据接收线程

Yes

是停止标志吗?

退出线程

No

读取数据

解析命令

QUIT 命令

其他情况OK 命令ERR命令LIST 命令JOIN命令

删除用户数据

命令执行成功命令执行失败显示全部用户显示用户加入直接显示

用户信息

显示用户离开

休息 200毫秒

五、程序设计(代码)

服务器端设计:

引入网络操作命名空间 、.Sockets;

线程处理命名空间System.Threading

第一步:界面设计及类与相关成员的定义

对界面进行设计(简单)

对内部函数进行设计(要编写一个独立的类即Client类,封装了客户端的信息

与连接,每一个客户进入聊天室,就创建一个Client对象,用于保存该用户的信息并接收用户数据和发送信息到客户端)

几个重要的类: TcpListener 类(服务器套接字创建)、Socket 类

internal static Hashtable clients =new Hashtable (); //clients数组保存当前在线用户的client对象private TcpListener listener;// 该服务器默认的监听端口号

static int MAX_NUM = 100; // 服务器可以支持的客户端的最大连接数

internal static bool SocketServiceFlag =false ; // 开始服务的标志

//获得本地局域网或者拨号动态分配的IP 地址,在启动服务器时会用到 IP 地址

private string getIPAddress()

{

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

IPAddress [] Addresslist=Dns.GetHostEntry(Dns.GetHostName()).AddressList;

if(Addresslist.Length<1)

{

return "" ;

}

return Addresslist[0].ToString();

}

//获得动态的 IP 地址

private static string getDynamicIPAddress()

{

IPAddress [] Addresslist =Dns.GetHostEntry(Dns.GetHostName()).AddressList;

if(Addresslist.Length < 2)

{

return "" ;

}

return Addresslist[1].ToString();

}

//服务器监听的端口号通过 getValidPort() 函数获得

private int getValidPort(string port)

{

int lport;

//测试端口号是否有效

try

{

//是否为空

if (port =="" )

相关文档
最新文档