面向对象编程技术作业题

聊天系统 院

面向对象编程技术作业题

——聊天系统

一、 问题分析

创建一个聊天系统,该系统由服务器程序和客户端程序两部分构成。其工作原理是:当服务器程序运行时,首先启动一个监听器,负责监听服务器的某个端口,当客户端要进行聊天时,首先要对服务器的特定端口进行连接请求,即客户端试图连接服务器被监听的端口时,服务器的监听器可以选择接受或拒绝连接请求。如果接受客户端的连接请求,则由监听器为客户端分配一个对应的“套接字”对象,这样在服务器和某个客户端之间就建立了一条数据管道,可以聊天了。本聊天室主要采用Socket(套接字)编写,套接字可以支持TCP和UDP协议。

本聊天室采用TCP/IP协议,在完成基本的建立通信连接,显示,发送,退出,服务器管理客户端用户连接与否的基础上,还添加了私聊,屏蔽,和两个客户端传送文件的功能。

二、 算法设计

本次作业没有涉及复杂的算法,主要是基于Win Socket的原理实现的。在完成保证基本的通信功能的前提下,又加入了能动态显示在线用户退出和在线功能,并且能够选择某一在线用户进行私聊的功能,客户端可以禁止某一用户在线的功能,以及简单的传输文件功能。其中涉及了简单的逻辑算法,也在本节中予以体现。

首先介绍一下WinSocket的基本原理,这是程序的算法核心。Windows Sockets(简称WinSock),即Windows下网络编程的规范,为应用程序提供了开放的、支持多种协议的网络编程接口,它已成为Windows网络编程的真正标准。Windows Sockets 定义了如何通过API实现与Internet 协议族(通常指的是TCP/IP)的连接。应用程序通过调用Windows Sockets的API实现相互之间的通信。

Socket的通信方式有两种方式。第一种方式是有连接的流方式,即需要在通信的两个应用程序之间建立一条连接链路,即利用TCP协议;第二种方式是采用无连接的数据报方式,也即UDP协议。本系统是采用有连接的流方式。在这种方式下,两个通信的程序之间首先要建立一条链路,然后数据才能被正确地接收和发送。这种方式对应的是TCP(传输控制协议)协议,通过TCP协议可以与指定IP地址的主机建立连接,并利用建立的连接双向地交换数据。有连接的流的特点是通信可靠,对数据有重发和校验机制。

利用CSocket进行有连接的数据通信需要建立一个全关联,同时要求通信的双方必须有一方扮演服务器的角色,等待另一方(Client)的连接请求。在服务

聊天系统 院

器段需要建立一个监听套接字,然后在此套接字等待连接。而当连接建立后,则需要创建一个新的套接字用于通信。客户段在创建套接字后,只需要简单地调用连接函数,就可以创建连接,进行通信了。双方的函数调用顺序如下图所示:

Server Socket() Bind() Listen() Client Accept() Socket() 建立连接 Connect() Read() 请求数据 处理服务请求 Write() 应答数据 Close() Close() Read() 阻塞等待客户数据 Write()

本程序选择基于消息的异步套接字,因为很多情况下,阻塞方式会影响应用程序的性能,所以有时需要采用非阻塞方式实现网络应用程序。Windows Sockets为了支持Windows消息的驱动机制,使应用程序开发者能够方便地处理网络通信,他对网络事件采用了基于消息机制的异步存取策略。Windows Sockets的异步选择函数WSAsyncSelect提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与该事件相关的一些信息。

因此,可以针对不同的网络事件进行登记,例如,如果登记了一个网络读取事件,一旦有数据到来,就回触发这个事件,操作系统就会通过一个消息来通知调用线程,后者就可以在相应的消息相应函数中接收到这个数据,因为是在该数

聊天系统 院

据到来之后,操作系统发出的通知,所以这时肯定能够接收到数据。采用异步套接字能够有效地提高应用程序的性能。

实现通信过程的具体算法流程参考了VC++深入详解,基本按照如下步骤建立的。

1. 2. 3. 4. 5. 6.

加载套接字库,调用WSAStartup函数初始化。

创建并初始化套接字,为定义的ChatDlg类增加SOCKET变量,实实现接收端功能。 实现发送端功能。 终止套接字库使用。 利用主机名实现网络访问。

现初始化,自定义套接字相关消息

动态显示用户算法实现,以服务端为例,首先创建一个结构体变量,存储于 用户相关的信息。当然这个结构体数组的大小决定服务器支持连接用户的大小。当一个用户发来连接请求时,将此用户的信息添加到结构体数组中,如果有用户发来断开请求时,接收消息成功后,将用户从此数组中删除。没有一次这样的操作,都选择对显示此项功能的List进行更新。

私聊功能算法实现,假设甲乙两个用户,甲要对乙私聊,甲向服务器发送消息时,应当携带私聊的内容那个消息和私聊的对象的消息,然后服务器获得此消息后,直接将消息转发给乙,而不向任何连接的用户发送消息。同样,屏蔽消息功能的算法相同,只是在自己客户端接收的消息中,找到发给自己的消息显示并记录(实际上已经接收到服务器发给本端的所有消息,只不过不予显示)。

传输文件算法也是相同,找到要传输端,然后向客户端发送相应的消息,客户端判定是什么网络事件,在case中作处理,发送给要传送的客户端,将这两端联系起来,实现了点到点的连接,可以收发文件了。

将聊天信息保存的实现,我采取了首先写一个全局的函数,函数完成功能是新建一个以“聊天记录”或“客户端名字”的.txt文件。然后再程序中,每一个收发消息的判断后将这段函数加上,将传递的信息内容取出,追加到建立的文件的尾端,写入后关闭。

三、 方案设计

本算法基于Visual C++ 6.0编程,采用MFC AppWizard(exe)工程,基于对

话框(添加控件十分简单,所以放弃用VIEW视图)实现的聊天系统。分服务端和客户端。 (一) 服务器端

在算法设计中已经提到,本程序是根据基于消息的异步套接字实现,再此不 再赘述具体的建立的过程。本节细致的介绍一下服务器的设计并实现的具体方案

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4