版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
企业内部聊天室的系统设计摘要随着计算机科学和互联网的快速发展,网上聊天已经成为人们相互交流的方式,与E-mail和电话相比,聊天服务更加实时性和有效性。如今,越来越多的聊天室出现在我们的生活中,它的存在为人们提供了一个相互沟通的平台,但是目前国内外对于这类聊天室的研究还比较少。本课题采用软件工程方法,综合编程技术和网络技术,以VisualC++6.0为系统前台应用开发工具,主要研究了TCP/IP协议下的局域网聊天室。这个局域网聊天室使用客户端/服务器(C/S)模型和TCP/UDP连接。它由两个模块组成:服务器和客户端。本文详细介绍了该局域网聊天室的设计与实现。服务器模块用于维护网络上的所有用户信息,例如用户名。聊天客户端模块主要包括:用户登录、信息发送、信息接收等。整个项目编制有条不紊,逐步完善了系统功能。该系统采用CSocket实现连网功能。本文介绍了系统的设计思想和实现过程,并给出了部分代码。CSocket是MFC派生出来的CAsyncSocket同步阻塞Socket的封装类。Socket是一个开放的,多协议的网络编程接口,被广泛地使用在Windows中。此聊天室是一组适用于互联网网络的网络聊天室,操作简单、灵活性、稳定。聊天室的主要功能模块有:用户管理,图像处理,本文介绍了该聊天室的结构和主要功能。聊天室允许多人聊天和传输图片。关键词:vc++;MFC;Socket;多线程;C/S 目录TOC\o"1-2"\h\u20431摘要 I第一章、绪论如今,人们对网络的依赖程度越来越高,越来越离不开网络,所以聊天工具也越来越多。网络真的替我们省下了不少资源,比如不用专门去公司开会。但是,有时候一些不可避免的情况比如这两年的疫情,人们不得不在家呆着,这时网络的作用便显现出来。因此,基于VC++网络编程的强大功能,本次毕业设计使用VC++编写一个多人对话系统。本系统基于VC平台上,系统的设计使用了面向对象技术和面向对象设计原则。系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过CSocket传递消息。此次设计使用VC++语言编写,开发工具采用VC6.0。1.1论文的目的与意义近年来,随着全球信息化的不断壮大,互联网科学也在快速发展。为了高效、快捷地处理各种业务,愈来愈多的企业在内部工作中使用局域网。
通过内部局域网帮助,企业可以简化信息流程,提高信息交换的速度,提高工作效率。
但是,随着企业规模规模的扩大和业务量的增长,企业内部的信息也变得越来越私人化,企业只希望其员工通过内部局域网进行交流和沟通,这样企业内部的秘密就不会通过互联网泄露给外界。
但是企业内部的员工很难随时随地与外界进行沟通交流,这样就存在安全隐患。
为了解决以上矛盾,提出了局域网聊天软件的开发思路,企业员工可以通过局域网聊天软件进行即时消息传递,召开网络会议,随时发布任务。
系统采用基于Socket的方法实现LAN通信,Socket的局域网通信软件能够为原有局域网提供良好、安全、快捷的通信机制。
它能够根据企业的业务需要,灵活地选择适合企业自身局域网通信的方案,并且能够实时地将企业内部局域网的数据传送给企业外部的主干网络。
它的实现无需改变企业原有的局域网硬件,具有成本低的优势,它的使用可以有效的减少局域网的通信负荷,提高局域网的使用效率,可以很好的解决企业局域网的各种通信需求。基于Socket的局域网聊天工具很好的解释了Socket通信的原理,在企业内部通信的通信、教学和讨论等方面具有实用价值。
它具有速度快,保密性好,网络带宽资源低,服务器吞吐量小,编程方便等优点。
在此基础上,本文对基于网络的局域网通信进行了深入网设备和通信协议,并对其进行了测试。
基于Socket的局域网通信软件应用广泛,不仅可以满足传统的通信需求,而且可以扩展到网络教育、大数据、视频、数据、视频、音频、视频传输等新的网络应用中,具有广阔的应用前景。1.2论文主要内容本文主要研究局域网中的多人聊天室,它是利用客户端和服务器的模式,以及TCP/UDP协议,在客户端与服务器之间信息传输和图片发送。聊天室由两个部分组成:客户端和服务器。首先,需要打开并登录到该服务器,指定该服务器的IP地址和端口号,然后通过打开客户端和设置网名来连接到服务器。一旦连接完成,客户端可以互相发送消息和照片。服务器端则主要用于维护网络上的所有用户信息;本文详细描述了系统的软件设计和硬件设计,并给出了部分程序的代码。客户端主要包括了用户登录、图片发送和接收,信息发送和接收等功能。整个程序采用结构化编程的方法,对系统功能进行逐步的编译和完善。本设计的实施需要精通VC++语言,熟悉VC++平台操作,对于MFC、套接字、多线程技术知识有所了解。1.3国内外聊天系统的现状目前,国内外有很多做聊天系统的公司,也有各种各样的产品,如腾讯的QQ、微信,抖音等。这些公司都在自己的产品中加入了聊天功能,但是各种产品都存在不足之处,比如:产品的交互性、语音识别、聊天的时效性等等。我用最具标志性的QQ和MSN做了一些研究,为聊天系统的开发做准备。毫无疑问,自99进入国内即时通讯市场以来,腾讯在该领域占据主导地位,并迅速获得了市场份额。一直稳居国内用户第一,即使在微软MSN的大力推动下,腾讯QQ的时长占有率也一直在稳步提升。腾讯的成功得益于其对移动互联网的创新和完善,腾讯的成功在于它利用移动互联网不断的进行创新和完善,尤其在QQ上。参考了网络上的信息,也通过自己的观察和了解知道了腾讯QQ运行时间的各种细节。腾讯公司的这些技术手段,使得它在网络安全方面采用了一些方法,对腾讯公司的服务器进行了分析。可以肯定的是,腾讯QQ是一个多服务器服务,是总控客户端,与客户端UDP直连通信。
服务器只能在两个客户端之间无法建立直连的情况下进行中转通信服务器。这些都是国内通信系统的现状,虽然国内和国际通信技术已经得到了很好的发展,但仍有很多地方要走。例如聊天系统的发展就是其中之一。我借用了现有的聊天工具与技术,设计了自己的一个聊天系统。希望我们能够尽快跟上国际国内先进技术的步伐,为国家和社会科技的发展做出自己应有的贡献。图1-1腾讯QQ模型。与腾讯QQ不同,微软的MSNMessenger只使用TCP作为传输层通信协议,所有客户端都通过TCP连接到服务器上。图1-2是MSN服务器-客户端模型。图1-1腾讯QQ服务器-客户端模型图1-2MSN服务器-客户端模型在腾讯所采用的模式中,服务器主要处理不同客户端状态的控制,这可以极大地减轻服务器的处理负担,但是其内部协议和实现非常复杂。在微软的操作系统中,用户可以自定义各种操作,可以使用自定义的方法,将需要传送的数据进行分类,并且降低网络通信的成本是非常重要的。另一方面,MSNMessenger的所有数据都要通过服务器,造成很大的压力。(这也是很少看到MSN的语音视频聊天的原因)。所有上述软件都可以通过广域网进行即时通信,具有不同的使用特点和实现优势。例如:目前市场上比较常见的局域网聊天工具,它可以让普通用户在互联网上的即时通信软件主要是针对企业内部的员工可以在家中或者在公司内部进行聊天。但随着企业规模的扩大,业务量的增长,企业内部信息越来越密切,企业只希望员工通过企业的内部局域网进行交流和沟通,为了避免Internet通过互联网将企业内部机密给外界,因此局域网聊天也占据了较大的市场[2]。1.4可行性分析本设计采用VisualC++6.0作为设计平台的框架,采用了vc++、MFC等语言,使系统软件的系统软件开发平台更加成熟和可行。该设计主要解决客户端和服务器之间的消息传输和图片传输问题,程序分为服务器端和客户机端两部分,服务器端提供网络端口,等待客户机的连接请求,登录服务器进行消息传输和图片发送;并且在成员列表中显示所有在线人员的身份识别信息。客户端通过服务器发送连接请求的IP地址和端口号,然后登录到一个聊天室,服务器端的成员列表显示所有在线的人员。如果有人脱机,该列表将自动删除。整个程序的主题使用CSocket类和TCP/UDP协议来消息传输和图片发送。本程序的主要功能是对客户端的请求进行处理,并且将处理后的消息发送到客户机,客户端根据接收到的消息进行相应操作。分析表明,该设计可以在VisualC++中完全实现。
第二章、系统开发环境与关键技术2.1VisualC++可视化集成开发环境简介VisualC++是一个强大的可视化软件开发工具。Microsoft公司微软公司在1993推出VisualC++1.0以来,它已成为专业程序员人员的首选软件开发工具。本文将以一个实例来阐述如何应用该工具进行软件开发过程中的各项技术和方法。VisualC++6.0不仅是一个C++编译器,也是一个基于Windows的可视化集成integrateddevelopmentenvironment环境。VisualC++6.0由很多小组件组成,其中包括编辑器、调试器和开发工具,如AppWizard、程序向导以及类ClassWizard。编辑器提供了一个可以在任意的地方使用的编程语言编程语言的使用者只需要在开发环境中使用简单的编程语言编写代码,而不是开发环境的重要组成部分。通过一组名为“DeveloperStudio”的组件,这些组件将组成一个和谐的开发环境。VisualC++提供了一个MFC类的库,用户可以很容易地开发他们想要实现的功能。在图形界面设计中,人们对图形的处理和编辑都需要大量的时间和精力,所以,使用它来进行图形界面的设计是非常有效的。VisualC++完成它的目标所需的时间(特别是对于具有图形界面的程序)比TurboC这样的工具要少得多。2.2MFC编程MFC是微软的基础类,它本质上是一个按照C++类层次结构组织的类库,因此是一个面向对象的框架。这种方法不仅使用了面向对象的思想和方法,而且在类库的建立、管理及维护上有很大的方便。程序员可以使用该库高效地开发基于Windows的应用程序。MFC封装应用程序中的应用程序类、类的继承、动态约束、类的关系和相互作用。这样的程序设计方式使得程序员能够根据自己的需要,灵活地选择类的封装方法。因此,程序员可以把它看作是一组可以按照不同的开发需要实现的开发模板。MFC向软件开发者提供一系列服务,以协调应用程序。这些服务可以使用户不再需要编写复杂的代码,而只需要简单的操作。通常,MFC会在后台执行一系列的复杂操作,为我们提供了一个更简单的编程界面。本文介绍一个简单的,基于标准的应用程序框架,它支持用户接口的标准化。MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员通过该实现来填写特定应用程序的详细信息。这样做的好处是能够在编写程序时自动生成一个完整的、完全的应用程序员通过将代码添加到应用程序中来完成特定应用程序的编译。VisualC++提供了这样做的工具:可以使用AppWizard生成初始的初始框架文件;使用“资源编辑器帮助可视化用户接口;
ClassWizard用于帮助将代码添加到框架文件;最终通过类库实现应用程序特定的逻辑[3]。与其他类库相比,MFC具有以下优点:1.对所有函数、控件、消息、GDI基本图形函数、菜单和对话框提供完整的Windows支持。类的设计和API函数的组合是合理的。2.在消息处理时,如果没有出现易出错的switch/case语句,那么所有消息都将映射到类的成员函数。这种直接的消息到方法映射适用于所有消息。3.支持异常错误的处理,减少了出错的机会,支持续改进,使得系统一描述了应用程序的所有功能。它通过宏将消息映射到成员函数,它们也不一定是虚拟成员函数,因此不需要为消息映射函数创建一个虚拟函数表(V表)以节省内存等。4.通过向文件发送对象信息以及识别成员变量的能力,提供更好的判定支持。5.可以使用各种不同的数据结构,如关系、数据库、表格、文档、图形、表格、属性和图像,来生成一个高级的、复杂的框架文件。6.支持异常错误处理,降低程序出错的几率。这样就使得程序开发人员有了很多的选择对象的类型,并把对象的属性存储在这个类中。7.确定运行时数据对象的类型。允许在实例化时动态地操作域。8.代码少并且速度快。MFC库添加的目标代码不到40k,比传统的CWindows程序效率只有5%。9.强大的应用程序可以通过与MFC紧密集成的AppWizard和ClassWizard工具快速开发。10.此外,使用MFC时允许混合使用各种传统函数。2.3Socket套接字套接字是通信的基石,是支持TCP协议的基础网络通信业务单元。
它可以把不同的网络设备连接起来,实现数据传输。它可以被看作是不同主机之间双向通信的端点,在单个主机内和整个网络中形成编程界面。进程的运行状况和运行时间,进程间的相互影响应于进程之间的相互连网络中的进程都要使用套接字来进行相互间的通信。套接字是通信域中的一种抽象概念,通常用同一域中的套接字来交换数据。进程使用相同的域使用Internet协议簇彼此通信。在互联网上的通信需要至少一对套接字在客户机端上运行,称为ClientSocket,另一对套接字在服务器端上运行,称为ServerSocket;
一是启动服务器端套接字,第二是启动客户端套接字,第三是启动服务器端和客户端套接字。根据套接字如何启动以及本地套接字试图连接什么,套接字连接过程可以分为三个步骤:1)服务器监听,是一种服务器端的套接字,它不定位特定的客户端套接字,但一直处于等待连接、实时监控网络状态。2)客户端请求,客户端套接字提出的连接到服务器端套接字的请求。如果用户的客户端的套接字不是服务器的套接字,那么用户就不能直接与服务器端进行通信。要做到这一点,客户端套接字必须首先描述要连接到的服务器端套接字,指示服务器端套接字的地址及端口号,然后请求连接到服务器端套接字。3)连接确认,指服务器端套接字侦听或接收来自客户端套接字的连接请求。响应客户端套接字请求,创建一个新线程,向客户端发送服务器端套接字说明。一旦客户端确认说明,则建立连接。如果客户端没有确认服务器端套接字的描述,那么客户端就不会进行连接。继续监听状态服务器端套接字,并继续接收来自其他客户端套接字的连接要求。4)断开连接,是指客户端向服务器提出断开请求,此时服务器断开与客户端相关的所有套接字,服务器继续监听状态下一个连接请求。在服务器端的数据库中,数据库服务器和数据库管理员的地位是非常重要的。图2-1是基于TCP的网络通信模式图2-1基于TCP的网络通信模式2.4多线程编程线程是操作系统中一个非常重要的概念,进程不同于线程,进程是线程的容器,线程创建于某个进程环境,它仅生存于该进程中,这就意味着线程只是在它所属的进程地址空间中执行代码,并在进程的地址空间中对数据进行操作。创建一个进程时,它的第一个线程称为主线程,并由系统自动生成。由这个主线程生成额外的线程,而这些线程又可以生成更多的线程。MFC类库提供了多线程编程支持,使用户编程更加方便。重要的是,在多窗口线程情况下,MFC直接提供了用户接口线程的设计。MFC区分两种类型的线程:辅助线程和用户界面线程。辅助线程没有消息机制,通常用来执行后台计算和维护任务。MFC为用户界面线程提供消息机制,作用是处理用户的输入,响应用户产生的事件以及消息。但对于Win32的API来说,这两种线程本质上并没有区别,它只需要线程的启动地址用来启动线程执行任务。Win32函数库中会提供多线程控制的操作函数,其中包括创建线程、中止线程、建立互斥区等。创建辅助线程相对来说比较简单,只需实现控制函数和启动线程,不必从CWinThread派生一个类。创建用户界面线程有两种方法:1)从CWinThread类派生一个类。需要注意的是,必须要用宏DECLARE_DYNCREA和IMPLEMENT_DYNCREATE对该类进行声明和实现,然后调用AfxBeginThread创建CWinThread派生类的对象进行初始化启动线程运行。2)通过构造函数创建类CWinTread的一个对象,由程序员调用函数::CreateThread启动线程。2.5C/S模式C/S模式即Client/Server(客户端/服务器)结构,是指同时为多个客户端服务的服务器。C/S模式的基础是并发性,由于该基础的支持,可以多个客户端访问同一服务而不必等待服务器先完成前面的请求。在C/S模式中当一个请求到达服务器时,服务器会交给一个可以与现有线程同时执行的控制线程。在设计并发服务器时,常见的服务器代码分为两部分:一:负责侦听,接收客户端请求,二:为客户端建立新的服务线程;代码的另一部分则处理单个客户端请求,例如,与客户端交换数据以提供特定的服务。图2-2显示了如何为服务器创建多条线程以服务多个客户端。图2-2服务器创建多个线程为多个客户端服务这种C/S结构的优点是,可以充分利用客户端的处理能力,并且大部分工作都可以由客户端处理并提交给服务器。相应的优势是客户端响应速度快。
主要体现在以下两点:(1)应用服务器数据负载小。应用服务器的这一特性使数据库管理系统中的数据库应用可以由多个独立的服务器承载,从而大大降低了应用服务器的负荷。最简单的数据库应用的C/S体系结构包括两个部分,客户应用程序和数据库服务器程序。这两个程序可以分别称为前台程序程序和后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序启动,它就准备好响应客户程序的请求。应用服务器和客户程序的关系是通过客户程序和客观上具有一定的网络合电路和数字滤波器可以将客户应用程序和服务器端连接起来。客户应用程序在应用服务器上运行,这与服务器端的较重数据负荷相对应。客户应用程序运行在用户自己的计算机上,该计算机对应于数据库服务器,也称为客户电脑。
这样,客户程序与应用服务器的数据交换通过客户端的查询和数据库中间件的设计使得客户程序和应用程序之间的数据交互成为可能。当数据库中的数据需要执行任何操作时,客户程序会自动找到并请求服务器程序,该程序对预定义的规则做出响应并返回结果,而应用服务器运行的数据负载较小[4]。(2)数据储存管理功能更加透明。在数据库应用中,数据存储和储存管理功能分别由服务器程序和客户应用程序执行,不同的(已知或未知的)前台应用不能破坏的规则通常集中在服务器程序中执行,如访问者权限、可重复编号和客户下定单要求。在数据库应用中,数据的储存管理功能,是通过数据库服务器与客户程序相结合实现的。所有这些对于前台程序的最终用户来说都是“透明的”,他们可以做所有的工作,而不需要询问(并且经常干扰)背后的过程。在客户服务器架构的应用中,前台的程序不是很“瘦小”,问题就留给服务器和网络去解决。在C/S体系下,数据库不可能真正是一个公共的、专业化仓库,它是独立的、专业的管理。两个通信应用程序之间的主要交互模式是客户机/服务器模式,即客户端向服务器发送服务请求,而服务器接收请求并提供相应服务。客户机/服务器模式是当前计算机通信的主要模式,它可以实现计算机与外部设备之间的数据交换,并且可以通过网络实现计算机之间的资源共享。客户端/服务器模式基于两点:第一。建立该网络的原因是硬件和软硬件资源、运算能力和信息在网络中的不平等,以及共享这些资源的需要,这导致资源多的主机和资源少的客户要求服务的非对等作用。其次,网络之间的网间进程通信是完全异步,相互通信的进程之间既没有父子关系,也没有内存缓冲区共享,因此需要建立机制,在希望进行通信的进程之间建立联系,并同步它们之间的数据交换[9]。客户机/服务器模式运行过程中采取主动请求的方式:首先,服务器根据请求启动并提供相应的服务:1)开通通信通道,并通知本地主机愿意接收客户在公认地址的请求;2)等待客户的要求到达港口;3)接收服务请求、处理请求并发送应答信号。服务请求的发送方在一定条件下可以使用该应答信号发送服务,但是该应答信号不能够传递给客户,如果该应答信号的传递方式不当,服务可能会出现失败。服务结束后,关闭与用户的通信链路并终止;4)返回步骤二,等待客户要求;5)关闭服务器。客户方:1)打开通信通道并连接到主机服务器的特定端口,在该特定端口上,连接到服务器所在的网络环境,将服务器端口的地址映射到网络环境中的一个网段。2)将服务请求发送到服务器,等待并接收响应;3)关闭通信通道,请求结束后终止。因此:1)客户和服务器的操作不对称,因此编码不同;2)服务进程通常在客户请求之前就开始了。在某些情况下,服务进程是由一个用户的需求所激发,并且在某些情况下,服务进程是由另一个用户的需求所激发。
只要系统还在运行,服务进程就会一直存在,直至正常终止或强制终止。2.6TCP/UDP协议TCP协议是一种传输层协议,在IP环境中,TCP提供可靠的数据传输,包括数据流传送、可靠性、有效流控、全双工操作以及多路复用。UDP不提供IP可靠性、流控或差错恢复功能。一般来说,TCP适用于高可靠性要求的应用,而UDP适用于低可靠性要求、传输经济性差的应用。TCP支持的协议主要有Telnet协议、FTP协议和SMTP协议。一些应用程序提供的协议也不那么可靠性。
UDP支持诸如NFS(网络文件系统)和TFTP(公用文件传输协议)等协议.面向连接TCP:“面向连接”指在正式通信之前必须与对方建立连接。例如,当你打电话给某人时,你必须等电话线接通,对方拿起电话后你才能和对方交谈。传输控制协议(TCP)是一种基于连接的协议,这意味着在你正式发送或接收数据之前,必须与另一方有可靠的连接。在连接的过程中,每个参与者都是通过一系列的对话来完成的,比如:主机与从机、主机与从机之间的连接、从机与主机之间的连接等。TCP连接需要经过三个“对话”才能建立起来,这个过程是很复杂的,我们在这里只需要做一个简单的、直观的演示,你只需要理解这个过程。连接的三次对话,每次对话都得经过一个“连接”过程,这样的连接过程,我们称之为“对话”。让我们看看这三个对话的简单过程:宿主A向宿主B发送一组连接请求:“我想向您发送数据,好吗?”
“面向连接”是一种基于网络络,是在接收到数据包之后,主机。这是第一次谈话;主机B向主机A发送数据包,同意连接和请求同步(同步是指两个主机,一个发送,一个接收):“是的,你什么时候发送?”
这是第二次谈话。主机A发送了另一个确认主机B同步请求的数据包:“我现在就发送,你继续!”
这是第三次谈话。
三个“对话”的目的是同步数据包的发送和接收,在主机A正式向B主机发送数据之前需要三个“对话”。TCP协议为应用程序提供了一个可靠的通信连接,允许从一台计算机向网络上的其他计算机发送无错误的字节流。具有高可靠性要求的数据通信系统通常使用TCP协议传输数据。面向非连接UDP协议:“面向非连接”是指直接向另一方发送通信,而不论另一方的状态如何,无需在正式通信之前建立连接。这和手机短信很相似:当你发短信时,你只需输入对方的手机号就OK。UDP(UserDataProtocol)是一种与TCP相对应TCP用户数据报协议。这是一个不非连接的协议,它不相互连接,但直接向它们发送数据包!这样,当对方主机收到数据包时,可以很快的判断出来是否有故障,从而提高系统还有一个好处:它是基于网络流量控制的。UDP适用于每次只传输少量数据且不需要太多可靠性的应用环境。如果我们在这种情况下就无法通信了解一些特定的网络环境,例如网络的连接状态不稳定、网络的连接速率低或者网络的传输速率低,都能够利用这种协议。例如,我们经常使用“ping”命令来测试两个主机之间的TCP/IP通信是否正常。实际上,ping命令是通过向另一个主机发送ICMP数据包,然后由后者确认收到包。如果数据包及时返回消息,网络就打开了。例如,默认情况下,一个“ping”运算发送四个数据包。发送的数据包数为4,接收的数据包数为4(因为另一个主机将发送一个确认接收的数据包)。这充分说明UDP协议是非面向连接的协议,不需要建立连接。它的通信过程是:用户发送数据包之前者是在非连接的环境下进行通信,后者是在连接的环境下进行通信。由于UDP协议不需要连接过程,因此通信效率较高。但这就是为什么它不像TCP协议那么可靠性。QQ使用UDP发送信息,所以有时你得不到它们。
第三章、企业聊天室系统的总体设计3.1系统简要介绍聊天系统的功能主要是通过聊天工具来实现的,它是人们在交谈时使用计算机技术而开发的,可以满足人们的日常交际需要。
聊天系统的实现方法有很多,比如ICQ,属于点对点聊天系统。
还有一个基于Socket的集中聊天系统,需要访问统一聊天服务器。在这种情况下,如果用户不能够很好地理解这些信息,就会造成聊天质量的下降。在Socket的聊天系统中,有两个主要角色:服务器和客户端。不同的客户端登录到集中式服务器,并通过服务器将消息从一个客户端推送到其他所有客户端。基于Socket的聊天系统,首先使用网页刷新方式来实现,随着时间的推移,它会自动刷新从服务器端到客户端显示的页面。这种缓慢的聊天很快被更新的聊天技术所取代。聊天系统主要是在客户端和服务器之间进行文字信息的传输,服务器端只需要将最新的文字信息推送到客户端,减少了网络传输内容,节省网络传输的次数,无疑提高了网络聊天的速度。而且,在客户端和服务器之间主要传送的是声音信息,这样可以提高声音信息的质量。这种“推”技术是基于Socket聊天系统的一种主要实现技术。Internet上的聊天室程序通常对服务器提供服务端连接响应,用户通过一个客户端程序登录到服务器,并与登录到同一服务器的用户对话,这是一个面向连接的通信过程。
服务器端的程序是一个独立的程序,而客户端程序的程序可以独立运行。
因此,程序想要在TCP/IP环境下实现客户端程序的程序和客户端的程序。对网络编程的VC++支持有套接字支持、WinInet支持、MAPI和ISAPI支持。其中,WindowsSocketsAPI是TCP/IP网络环境和Internet上最常用的API。美国加州大学Berkeley分校最先为TCP/IP协议开发了UNIX下的API,称为BerkeleySocket接口(套接字)。在当时的计算机界面上,这个套接字还仅仅只是一个数据传输的工具,并不具有任何意义。即使如此,Socket方法也是在桌面上的桌面操作系统进入Windows时代后继承下来的。随着网络技术的飞速发展,人们对网络的要求越来越高,网络编程也从简单的线性网络发展到现在的多媒体网络。在TCP/IP网络通信环境下,Socket数据传输是一种特殊的I/O,它也是一种文件描述符,具有类似于开式文件函数调用socket的功能。可以理解的是,Socket实际上是一个通信端点,通过它用户的Socket程序可以通过网络与其他Socket应用程序通信。Socket存在于“通信域”(用于描述普通线程如何通过Socket进行通信的抽象概念)中,并与另一个域中的Socket交换数据。Socket有三种类型。第一个是SOCK_STREAM(流式),它提供可靠的面向连接的通信服务,如telnet,http://www.stREAM。这些协议的支持,使得网络编程人员在实际工作中可以方便地利用它们来实现各种网络编程应用。第二个是SOCK_DGRAM(数据报),它提供不连接和不可靠的通信,如UDP。第三是SOCK_RAW,它主要用于协议开发和测试,并支持通信底层操作,如直接访问IP和ICMP。对于基本的套接字调用、Windows套接字的开始和结束、异步终止选择机制机制以及异步数据传输机制,WindowsSocket机制分析具有以下几点。一些基本Socket系统调用主要系统调用包括:socket()——创建Socket;将创建的Socket绑定到本地端口;connect()和accept()——建立Socket连接;listen()——服务器监听连接请求;send()——受控缓冲数据的传递;recv()——可控缓冲接收;closesocket()——闭塞Socket。WindowsSocket的开始及结束启动功能WSAStartup()建立与WindowsSocketsDLL的连接,终止函数WSAClearup()终止DLL,这两个功能必须配对使用。异步选择机制Windows是不采用UNIX阻塞机制的非抢先操作系统。当通信事件发生时,操作系统根据设置选择是否处理它,WSAAsyncSelect()函数用于选择系统要处理的相应事件。如果用户需要处理的网络事件与预先存储的网络事件不一致,则会被拒绝,这样用户可以直接从网络上下载网络事件。当Socket”接收到一组网络事件之一时,它向程序窗口发送一条消息,指定生成网络事件的Socket”、所发生事件的类型和错误码[5]。异步数据传输机在WSAAsyncSelect()设置Socket上须响应通信事件后,每个此类事件都会向窗口生成一条WM_SOCKET消息。这些窗口可以通过一个窗口回调函数来控制和管理。应将相应的数据传输处理代码添加到窗口的回调函数中。相关的流程图分别如图3-1:客户端和服务器端图3-1服务器与客户端在经济方面,需要注意的是,这个项目的实施只是为了探索和设计自己的学习,没有考虑到经济成本和其他方面的经济因素[5]。3.2系统的主要功能及其分析1.支持多个客户端之间的连接,实现服务器与多个客户端之间的数据传输;2.接收来自客户端的消息并将其显示在列表框中;3.用户连接后,会有一个提示,显示连接的用户名;4.在发送消息时显示所有聊天记录;5.客户可以相互发送和接收照片;服务器端聊天程序必须做到以下三点:1)服务器聊天程序在端口等待聊天客户的连接请求,并需要维护客户连接表,以记录所有成功的连接。2)服务器聊天程序可以及时接收来自不同聊天客户的消息,然后将其转发到一个或者多个用户连接上。
对于私人聊天室(如果没有公共聊天室,则服务器将接受来自源端的信息)),服务器将会对所有来自源端将接收到的信息转发到目标端。对公共聊天室而言,服务器将把接收到的信息发送给除源端外的所有客户。3)服务器还将监控这些连接的状态,如果用户自愿离开或出现问题,服务器会从列表中移除相应的表项并及时更新。客户端聊天程序需要执行以下功能:(1)客户端聊天程序负责建立和维护与服务器的联系,通过获取用户设置来尝试与服务器连接,并随时检查连接状态。(2)客户端聊天程序及时将用户输入的内容发送给聊天服务器。用户输入的信息有时候会因为时间、地点、环境条件等原因而不能及时间一长,用户与服务器之间的信息交换就变得非常繁琐。一般来说,当用户输入一行信息并按下回车键,聊天程序会及时将该一行信息发送出去,以满足用户的交互需求。(3)随时准备接收来自服务器的信息,并显示您接收到的信息,以便用户及时查看。(4)当用户退出聊天程序时,服务器断开。这种做法不仅能够解决用户的隐私保护问题,而且还可是这样做的话,会影响客户端的正常使用,甚至会引起系统崩溃。最好是提前通知服务器,或者直接向服务器发送退出通知,以便服务器能够及时跟踪客户端的连接状态,并将客户端的退出信息发送给相应的实体。3.3系统实现原理及设计思路企业内部聊天室系统的服务器端和客户端采用Socket技术收发消息,并遵循C/S模式。
该程序主要实现两个功能:消息传输和文件传输。
在设计中,采用了多线程技术来加快程序的运行速度,并使用了多线程技术来解决消息传输和文件传输的冲突问题。
其中,消息传输采用UDP协议,文件传输采用TCP协议。聊天室是一款基于对话框的应用程序。在对话框中,用户可以选择自己想要的内容,并可以选择不同的操作模式,如图1所示。该程序包含两个MFC套接字类,分别实现UDP通信和TCP传输。当套接字类接收数据时,通过向主窗口发送消息来处理数据,通知主窗口呼叫套接字类的成员函数。当程序开始运行时,它首先分别创建一个数据报套接字和流式套接字,然后让流式套接字监听端口以等待客户端连接请求。数据报套接字的发送端可以在局域网中发送消息,如果发送消息的次数超过一定次数后,数据报套接字在客户端的广播消息列表控件中显示。本地用户信息然后通过数据包套接字广播到局域网。当局域网内的其他用户接收到广播消息时,更新列表控件中的用户信息并将自己的信息作为UDP发送回去。消息相对简单。当用户发送消息时,程序会调用套接字类的SentTo函数,以UDP的形式将消息直接发送到消息的接收者,UDP在接收到消息后出现在窗口的聊天消息栏中。当文件被发送时,发送者首先通过UDP将文件信息发送给文件接收方,当接收者确认收到文件时通知发送方,然后文件发送方创建一个流式套接字连接到接收者并将文件信息发送给文件接收方,接收者然后创建一个线程准备传输文件数据。当文件接收方接受连接请求时,它首先从文件发送方接收文件信息,然后创建线程并准备接受文件数据。文件的传输是在客户端与服务端之间进行的,而且文件传输过程中还需要进而,该线程被配置为在传输文件数据包含有文件的文件名和文件数据。当文件接收线程开始运行时,将弹出一个要保存的文件的通用对话框,用户可以在其中指定要保存文件的文件名,然后希望文件发送方发送通知消息确认文件接收,然后双方开始传送文件数据。在整个文件传输过程中,文件的发送者充当客户端,文件的接收者充当服务端。在套接字的创建和通信过程中,会使用以下一些函数来处理相关的事件:(1)AfxSocketInit:该函数在初始化应用程序函数中调用,以确Winsock版本并进行一些套接字初始化。(2)Create():创建一个套接字,该套接字必须附有端口号。(3)Listen:侦听专用,用于向监听套接字发送命令进行端口监听。(4)Connect():客户端套接字专用于将连接请求发送到服务器。(5)Accept():专用于接收客户端通过网络发出的建立连接的连接请求接听套接字。(6)Send:用于将数据发送到套接字。(7)Receive():对于套接字接收数据。(8)Close():关闭析构函数可以调用的套接字。在整个通信过程,当一个事件被触发时,应用框架会接收某些自动调用响应函数消息。本文就是基于此目的而设计的一般的代码设计与实现是由代码的设计者和使用者来实现的。你可以将自己的代码编写到这些函数中,以便更好地完成通信过程。具体函数见下文:(1)OnAccept():当端口接收到连接请求时,应用程序框架会自动调用监听套接字,以通知它该请求可以接受或连接被拒绝。
可用于监控和控制网络通信中的各种网络设备的设计人员,网络管理员可以使用一个或多个函数来连接连接请求。
可以在此函数中调用Accept()来连接请求并建立连接。(2)OnConnect:当客户机套接字连接请求完成时,应用程序框架会调用该函数来判断它是否成功。(3)OnSend():框架调用此函数是为了通知套接字,Send函数现在可以被调用来传输数据。(4)OnReceive:框架调用这个函数是为了告诉套接字,现在可以调用Receive函数来从数据缓冲区中检索数据。(5)OnCloes:该框架调用此函数以通知调用方连接到的套接字已断开[6]。图3-2是系统实现原理框图的框图。图3-2原理框图3.4系统流程图根据用户的要求和功能设置,可以获得以下3-3的流程图:用户启动客户端,登陆服务器发送信息,启动服务器,等待客户端对在线用户信息的请求和反馈,用户发送信息到服务器,服务器处理用户数据,用户开始聊天;客户端的聊天是基于用户的属性和属性的信息来实现的。客户端聊天分为所有消息和私有消息,私有消息应该由程序控制单独处理。图3-3设计流程图第四章、企业聊天室系统的详细设计4.1企业聊天室服务器端的设计实现步骤1:进入VisualC++集成开发环境,选择“文件”、“新菜单”,打开““工程””选项卡,点击“MFCAppWizard(exe),指定项目为“电182企业聊天室服务器。选择好后,点击“选择”按钮,选择“新建”菜单,单击“创建”菜单,选择“确定”按钮。点击“确定”进入下一个界面。步骤2:选择“基本对话框”选项,如图4—1所示。步骤3:MFC设置,见图4-2。步骤4:下一步是连续单击“下一步”按钮并单击最后一帧中的“完成”按钮,此时将创建应用程序框架。图4-1指定要创建的应用程序的类型为基本对话框图4-2MFC的设置步骤5:在Dialog中打开IDD_SERVER_DIALOG界面,删除原始控件,添加10个控件,控件属性如表4—1所示,控制顺序设置如图4—3所示。图4-3服务器端编辑对话框资源表4-1服务器端对话框控件ID及属性控件名称控件类型控件ID端口:静态控件IDC_STATIC服务器名:静态控件IDC_STATIC启动按钮IDC_BT_START退出按钮IDC_BT_EXIT信息内容编辑框IDC_EDIT_MESTOSEND聊天信息编辑框IDC_EDIT_MESSHOW联系人列表列表控件IDC_LIST_SERVER发送按钮IDC_BT_SENDMES(空)编辑框IDC_EDIT_PORT(空)编辑框IDC_EDIT_SERVERNAME服务器实现过程过程如下:通过ListenThread函数建立监听线程,服务器打开监听线程,监听线程部分实现了套接字的创建、套接字命名、监听套接字,然后打开监听线程。m_serversock=socket(AF_INET,SOCK_STREAM,0);//创建ret=bind(m_serversock,(LPSOCKADDR)&addr,sizeof(addr));//绑定 ret=listen(m_serversock,10);//侦听 AfxBeginThread(ListenThread,this); //打开一条侦听线程,在ListenThread线程中,接收客户端请求并打开另一个监听线程,以便在阻塞被移除时侦听其他客户机的连接请求。Clientsock[k].clientsock=accept(pDlg->m_serversock,(sockaddr*)&clientaddr,&clientlen);//接收客户端的请求AfxBeginThread(ListenThread,p);//打开另外一个监听线程来侦听其他用户的连接然后,接收信息标识符,并根据不同消息标识符判断相应的处理函数。在一些实际系统中,由于采用不同的信息标识符,使得信息处理系统的运行效率大大降低。charrecvflag[3];memset(recvflag,0,3);intflagc=recv(clientsock[k].clientsock,recvflag,2,0);recvflag[2]='\0';CStringstrflag;strflag.Format("%s",recvflag);自己定义的消息标识符包括“QQ”表退出,“MM”表聊天信息,“FF”表档案,“CC”表连接PDlg->RecvMessage(clientsock[k].clientsock);//接收聊天消息4.2企业聊天室服务器端的工作流程
启动服务器应用程序之后,服务器运行如下:(1)设置服务器端口号,点击“开始”按钮,程序将创建一个监听套接字,在指定端口侦听客户机的连接请求。(2)当客户端请求连接时,会触发监听套接字的OnAccount事件,以便在事件处理函数中能够动态地创建连接套接字,与客户端进行通信。服务器支持多个客户端,因此将套接字添加到连接套接字队列。客户端在服务器中进行通信,并且在事件处理函数中动态创建连接收到呼叫请求后,服务器向各个客户端发送呼叫信息。服务器向每个客户端发送欢迎信息。(3)客户端发送聊天信息时,会在服务器端触发与连接套接字对应的OnReceiving事件,事件处理函数中读取聊天信息,并将聊天消息队列与服务器端表框连接;服务器端通过对聊天信息的处理后,实现了对聊天信息的分析、判断和处理。然后将聊天信息发送给每个客户端,以同步聊天信息。(4)在客户端断开之前,向服务器发送传出消息,服务器释放连接套接字队列中的对应套接字,并向每个客户机发送传出消息。(5)服务器停止服务时,首先向每个客户端发送服务器停止服务的信息,然后释放连接套接字配对列中的所有套接字。4.3企业聊天室客户端的设计实现步骤1:进入VisualC++集成开发环境,选择“文件”“新建”菜单,打开“工程”选项卡,点击MFCAppWizard(exe),指定项目为电182公司群客户端。
选择好后,点击“确定”进入下一个界面。步骤2:点击“基本对话框”选项,如图4-4所示。步骤3:MFC设置,如图4-5所示。步骤4:下一步是连续单击“下一步”按钮,然后单击最后一帧中的“完成”按钮完成应用程序框架。步骤5:在Dialog中打开IDD_CLIENT_DIALOG界面,删除原始控件,添加13个控件,控件属性如表4—2所示,并设置控件顺序。客户端首先创建一个套接字,然后主动连接到服务器,打开一个接收线程以接收来自服务器的信息,并且在RecvFrom服务器中,线程也会基于消息标识符进行不同的处理。图4-4指定要创建的应用程序的类型为基本对话框图4-5MFC的设置图4-6客户端编辑对话框资源表4-2客户端对话框控件ID及属性控件名称控件类型控件ID服务器ip:静态控件IDC_STATIC上线按钮IDC_BT_CONNECT下线按钮IDC_BT_EXIT员工名:静态控件IDC_STATIC端口:静态控件IDC_STATIC聊天信息编辑框IDC_EDIT_MESSHOW信息内容编辑框IDC_EDIT_MESTOSEND联系人列表列表控件IDC_LIST_CLIENTS发送(回车)按钮IDC_BT_SENDMES发送图片按钮IDC_BT_SENDFILE(空)编辑框IDC_IPADDRESS_IP(空)编辑框IDC_EDIT_CLIENTNAME(空)编辑框IDC_EDIT_PORT4.4企业聊天室客户端的工作流程客户端程序的工作程序比较简单,具体流程如下:(1)用户输入服务器地址、端口、昵称后,点击“上线”按钮,客户端程序将创建一个套接字并连接到服务器。
如果没有连接成功,则客户端程序将自动重启服务器,并保持原状。
如果连接成功,向服务器发送一条用户进入的消息。(2)当用户输入聊天信息时,点击“发送”按钮将信息发送到服务器,或者当用户打开图像时,点击“发送图片”按钮将图像发送给服务器。(3)当服务器从其他客户机接收消息或图像时,将它们发送给此客户端将在客户机套接字中触发OnReceive事件,并在事件处理函数中接收该消息,并将其显示在列表框中。(4)当用户点击“下线”按钮时,将用户离开的消息发送给服务器,然后断开与服务器的连接。
第五章、企业聊天室系统的调试运行5.1服务器端的运行设置当服务器端界面设计完成,并且所有服务器功能的监听线程、套接字和函数程序代码都用vc++编写时,我们编译并运行该程序以得到初始服务器端接口,如图5-1所示,然后将端口号和服务器名设置为5000,将服务器名设置为电182公司群,如图5-2所示。图5-1服务器端初始运行界面设置服务器端端口号和服务器名称后,单击“启动”按钮可以得到图5-3,“启动”按钮不起作用,“发送(回车)”按钮开始工作。图5-2服务器端设置图5-3服务器端启动5.2客户端的运行设置在完成客户端界面设计和程序编写后,我们在局域网内运行了三个客户端。客户端最初运行如图5-4所示,然后设置工作人员姓名张三、李四、王五,将服务器ip设置为,端口号设置为5000,界面如图5-5所示。图5-4客户端初始运行界面图5-5客户端设置3个客户端点击上线后,客户端的发送(回车)、发送图片及下线按钮启动而上线按钮停止工作。服务器端界面和客户端界面分别如图5-6、5-7、5-8和5-9。图5-6服务器端图5-7客户端张三界面图5-8客户端李四界面图5-9客户端王五界5.3服务器与客户端之间的聊天结果在服务器与客户端都设置完后即可进行聊天了以下为服务器与王五之间的通信如图5-10和5-11。图5-10为服务器通信界面图5-11为王五的通信界面5.4各个客户端之间的通信除了服务器-客户端通信外,该系统还有多个客户端之间共同通信的功能,员工可以在其中讨论生活和事业等各项问题,老板们也可以通过该系统向员工传达命令。客户端间的通信如图5-12、5-13和5-14。图5-12张三界面图5-13李四界面图5-14各个客户端之间的通信本企业聊天室系统还有传送图片的功能,可以使得员工之间或者上司和员工之间利用图片形式发布任务。如下列图5-15到图5-19是发送和接收图片的过程:图5-15打开要发送的图片图5-16接收图片图5-17存储图片图5-18图片接收成功图5-19接收到的图片以上为企业内部聊天室所实现的所有功能,包括客户端与服务器之间的通信、多个客户端之间的共同通信以及客户端之间传送图像等。5.5企业聊天室运行小结和程序运行步骤本次设计的企业聊天室程序能正常编译运行可以实现设计所要求的实现多人同时通信和相互传递文件图片的功能。本程序的运行步骤如下:1)打开企业聊天室服务器程序,设置服务器名称、IP地址和端口号,然后点击“启动”按钮,此时列表框会显示服务器启动。2)开启多个客户端程序,分别设置员工名、服务器IP地址以及端口号,再点击“上线”按钮,此时服务器窗口和客户端窗口都会显示该客户端上线的消息切服务器端和客户端“在线好友”列表会显示已在线人员名称。此时即可以进行聊天和发送图片。3)在编辑窗口编辑想要发送的消息,然后点击发送(回车)按钮,消息就会被发送出去,同时同步的显示在服务器窗口和所有客户端窗口。完成多人聊天功能。4)点击“发送图片”按钮,会出现一个对话框窗口,选择要发送的图片,即可发送图片出去,此后,服务器会出现“文件接收”选项,保存并打开图片,完成图片发送功能。5)在客户端点击“下线”按钮,即可使此客户端与所有其他客户端和服务器断开连接。断开所有客户端与服务器的连接,再点击服务器端“退出”按钮。会结束整个程序。图5-20为流程图图5-20企业聊天室运行步骤流程图第六章、总结与展望应用软件开发之是很难做的,VC编程有一定的知识,但是很少涉及到网络,通过学习和咨询知道套接字可以实现网络数据传输。SOCKET最初被选择作为网络编程最基本的实现。而且这些数据分析和实现都是通过一个简单的数据库连接器来实现的,对底层数据进行封装,然后用它可以方便地实现大量的套接字。尽管MFC封装了很多关于套接字的API函数,但它的实现并不容易,需要进行大量的数据分析与实现。当第一次使用SOCKET实现时,安装连接是成功的,但整个服务器在等待监听后处于死锁状态。尽管客户端成功访问,但服务端仍然无法做任何事情,甚至可能变得没有响应。关于这一点有很多的混乱,在一个偶然的研究中出现了阻塞一词,尽管之前已经知道SOCKET正在堵塞编程。这种现象在之前的学习过程中一直没有注意到,但是在最近的一次学习过程中终于在这篇文章中找到了答案,那就是多线程编程。后来,我终于明白了多线程编程的重要性,以前整个程序只有一个线程,线程就会一直监听状态,程序不能运行其他函数!发现问题后,开始学习多线程编程,准备将一个线程处理监听事件,另一个线程处理其他事件。由于监听代码是由多个线程共同开发的,在多线程的确,多线程编程是非常有效的,它可以使程序运行得更加流畅和稳定。当线程成功打开时,监听代码将写入声明的线程函数,监听将成功完成,但问题又来了。线程函数可以声明为类的全局函数或静态函数,后者在开发中被选择以保持代码封装性。如何将线程函数中接收到的消息返回到对话框?这次试验证明这个问题的存在,并且消息的传递方式是动态的,因此,线程函数中的数据传送就是在对话框中进行的。最初尝试定义一个全局变量,然后使用API函数SetDlgItem()处理它,但出现了一个编译问题,注意到没有定义声明的全局变量。线程函数定义为全局函数(它也可以使类成为静态函数),那么为什么线程中的数据不能被直接传输呢?最后,必须使用PostMessage方法返回消息,这一次成功地传递了消息。在后来的开发过程中,我们发现了这个问题,通过对线程函数中数据的处理,可以实现对话框的定义,而且可以实现消息传递是由一个类的静态函数实现的。然后问题来了,当成功地接收和发送消息时,它们最终被弄混了。乱码的问题是数组可以跨界访问,在设计过程中最好检查数组的安全性。但这一次,乱码似乎不寻常,并最终没有很好的解释,只有另寻他径完成设计。应当指出,不鼓励使用全局函数和变量是有理由的。全局函数和变量易于实现,但它们对程序封装和可移植性是一个巨大的挑战。C++的优点在于实现了多态和封装,程序员会尽量提高整个程序的低耦合度,使开发出来的程序易于移植。在一个多文件程序中,全局变量可以在多个地方进行修改,使得它们难以维护,在检查错误时也很难检测到。如果一个文件中有多个变量,那么这些变量的定义就很复杂。此外,全局变量可能会有重复定义问题,导致编译错误。在了解了CSocket类及其实现之后,我发现这是一种非阻塞的网络编程,它非常简单,不需要打开线程来处理监听事件。
但是由于在监听过程中,消息发送乱码经常出现,所以需要重新设计监听流程。
由于CSocket确实有许多优点,而且消息发送胡言乱语从来没有被解决过,所以最终使用CSocket来解决这个问题。通过使用该类函数我们可以在一定程度上解决乱码问题,但是也带来了一些负面影响,比如我们不能直接读取函数。在CSocket中,当应用程序框架收到有关特定特殊事件的消息时,会自动调用某些函数,在该消息中,您可以编写自己的代码以完成特定的事件。CSocket是一个基于CassyncSocket的扩展类,它封装了许多函数,其中OnAccept、OnSend、OnReceive、OnClose和OnConnect函数是由应用程序框架自动调用的。这些函数在连接、发送、接收和断开连接时调用,因此很容易向它们添加自己的代码以完成通信。但是,应该注意的是,这些都是虚函数,在使用之前必须内建到从CAsyncSocket或CSocket继承的新类中,然后在该类中重新定义以完成调用。应用程序框架调用这些函数的时候,需要在程序中增加一个内容提示的功能。如果您不这样做,应用程序框架将调用上面的函数,但是不会实现任何东西[7]。服务器监听时,请设置监听端口并创建监听套接字,以便客户端能够成功侦听。框架会根据消息的格式来判断是否允许连接,如果允许则会发送连接请求,如果不允许则会发送消息。客户端请求与函数Connect()连接,当连接成功时,框架自动调用OnAceept()函数。然后,连接到服务器上的客户端可以聊天。在聊天过程中,框架会在消息到达时自动调用函数OnReceive,并可以在函数中写入Receivee()来接收消息。当用户离开聊天室时,该框架自动调用OnClose()函数,该函数实时捕获用户的活动,正确显示在线状态,并向用户发送退出消息。服务器将所有客户端连接到网络,客户端发送的所有消息都被发送到服务器,服务器将对消息进行过滤并为每个客户端提供服务。向客户端传输数据,所以服务器中存储的数据量非常大,在服务器端需要对大规模的图像和语音信息进行处理,用户对服务器的性能要求也越来越高,服务器的处理速度已经不再是用户满意度的主要因素。服务器也面临着提供大规模图片、语音和视频的压力,特别是在拥有大量用户的情况下。在开发过程中,需要更多的研究,如图片发送、抖动窗口、语音视频发送、文件传送等。文章主要是通过对文字聊天功能的研究来达到提高用户体验的目标是通过文字聊天这一功能来帮助用户解决这时候就利用网络上的软件来完成自己的工作。但是我发现自己的知识有限,而且剩下的时间很短,只实现了文字聊天功能。在成功完成文字聊天后,我还尝试发送语音信息,当我调用API函数检测硬件信息时出现了错误。不为人知的错误信息总是很难被发现。[8]。基本功能实现后,我们开始进行界面设计,观看孙鑫的教学视频,并对基本界面开发的开发有一定的了解。单击状态栏时,该区域将更改为可编辑状态,并选择所有以前存在的文本。当时,我想知道为什么一个热门的东西会变成一个编辑框去写,仔细考虑,最后想出如何去做。腾讯公司提供的视频教学系统是一种基于多媒体技术的教育种场景分析:在本次设计中,我们使用的是腾讯的静态文本。两个控件,静态文本和编辑框,可以放在一个区域中。编辑框的作用是在屏幕上显示出来的,所以编辑输入文字符串显示在文本的下方,编辑框用于显示编辑框。静态文本用来显示文字,编辑框用来编辑输入文字。单击该区域时隐藏静态文本,显示编辑框。当鼠标单击该区域之外的任何区域时,会出现静态文本,影藏编辑框。当然,还有信息传递的问题。在软件开发过程中,我自己做得很不满意,尤其是时间安排上。在编写代码之前,对相应的知识的了解也很少。但通过不断地努力学习,最终取得了一定的收获,成功解决了许多问题。在实际使用时,也得到了不少的收益,有时还可以获得一些荣誉称号。这也证明,只要付出总会得到回报。
参考文献[1]明日科技,VisualC++从入门到精通(第4版)[M],清华大学出版社,2020.
[2]梁伟.
Visualc++网络编程案例实战[M],清华大学出版社,2020.
[3]谢希仁.计算机网络[M],电子工业出版社,2021.
[4]BehrouzA.ForouzanDataCommunicationandNetworking,online,2016.[5]孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006.[6]孙雄勇,VisualC++6.0入门与提高实用教程[M].中国铁道出版社,2003.[7]吕军,曲宝军.VisualC++从初学到精通[M].电子工业出社,2014.[8]JacksonMA.PrinciplesofProgramDesign[M].Houston:AcademicPress,2000.[9]AnthonyJones.NetworkProgrammingforMicrosoftWindows[M].Microsoftpress,2013.[10]郑阿奇,VisualC++6.0应用案例教程[M].电子工业出版社,2013.[11]梁普选,VisualC++程序设计与实践[M].清华大学出版社,2005.[12]候俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.
附录以下为服务器和客户端设计过程中创建套接字等各种功能实现的部分程序:服务器端:UINTListenThread(LPVOIDp){ CServer3Dlg*pDlg=NULL; pDlg=(CServer3Dlg*)p; ASSERT(pDlg!=NULL); CStringstrError; interror; sockaddr_inclientaddr; intclientlen=sizeof(clientaddr); intk=0; for(;k<=csnum;++k) { if(!clientsock[k].clientsock) { if(k==csnum)csnum++;//如果前面没有空,则使最大连接数加1 clientsock[k].clientsock=accept(pDlg->m_serversock,(sockaddr*)&clientaddr,&clientlen); if(clientsock[k].clientsock==SOCKET_ERROR) { strError.Format("AcceptError:%d",error=WSAGetLastError()); AfxMessageBox(strError); closesocket(pDlg->m_serversock); return-1; } break; } } //开启另外一个监听线程,监听其他用户连接 AfxBeginThread(ListenThread,p); //判断标识符,以调用不同的处理函数 charrecvflag[3]; memset(recvflag,0,3); intflagc=recv(clientsock[k].clientsock,recvflag,2,0); recvflag[2]='\0'; CStringstrflag; strflag.Format("%s",recvflag); CStringclientName;//客户名 while(strflag!=_T("QQ")) { if(strflag==_T("CC")) { //接收客户名 charreclientName[100]; memset(reclientName,0,100); intrecvlgc=recv(clientsock[k].clientsock,reclientName,sizeof(reclientName),0); if(recvlgc<0) { AfxMessageBox("recvclientnameerror"); return-1; } clientName.Format("%s",reclientName); clientsock[k].clientname=clientName; intitemcount=0; itemcount=pDlg->m_serverlist.GetItemCount(); //当有客户上线时更新列表 pDlg->m_serverlist.InsertItem(itemcount,clientName); itemcount=pDlg->m_serverlist.GetItemCount(); CStringcnames[25]; CStringstrsend; strsend.Format("%d*",itemcount); for(inti=0;i!=itemcount;++i) { cnames[i]=pDlg->m_serverlist.GetItemText(i,0); strsend=strsend+cnames[i]+"*"; } strsend="CC"+clientName+"*"+strsend; //sendtoalltoupdatelist pDlg->SendBackToall(strsend); CStringstrlog; pDlg->GetDlgItemText(IDC_EDIT_MESSHOW,strlog); strlog=strlog+"\r\n"+reclientName+"上线了。。。。"; pDlg->m_smesshow=strlog; pDlg->SetDlgItemText(IDC_EDIT_MESSHOW,pDlg->m_smesshow); CEdit*ce=((CEdit*)pDlg->GetDlgItem(IDC_EDIT_MESSHOW)); ce->LineScroll(ce->GetLineCount()-1); } elseif(strflag==_T("MM")) { pDlg->RecvMessage(clientsock[k].clientsock); } elseif(strflag==_T("FF")) { pDlg->RecvFile(clientsock[k].clientsock); } memset(recvflag,0,3); flagc=recv(clientsock[k].clientsock,recvflag,2,0); recvflag[2]='\0'; strflag.Format("%s",recvflag); } //下线时的操作 LVFINDINFOfindinfo; findinfo.flags=LVFI_STRING; findinfo.psz=clientsock[k].clientname; introw=pDlg->m_serverlist.FindItem(&findinfo); pDlg->m_serverlist.DeleteItem(row); CStringstrshow; pDlg->GetDlgItemText(IDC_EDIT_MESSHOW,strshow); strshow+="\r\n"+clientName+"下线了。。。。。"; pDlg->SetDlgItemText(IDC_EDIT_MESSHOW,strshow); CStringstrlose="QQ"+clientName; pDlg->SendBackToall(strlose); closesocket(clientsock[k].clientsock); clientsock[k].clientsock=NULL; clientsock[k].clientname=""; ASSERT(clientsock[k].clientsock==NULL); return0;}classCAboutDlg:publicCDialog{public: CAboutDlg(); //DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg)protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL //Itected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)//Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CServer3DlgdialogCServer3Dlg::CServer3Dlg(CWnd*pParent/*=NULL*/):CDialog(CServer3Dlg::IDD,pParent){ //{{AFX_DATA_INIT(CServer3Dlg) m_smesshow=_T(""); m_smessend=_T(""); m_port=0; m_servername
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沟通与技巧培训
- 建筑物防火装修材料选择方案
- 流程化营销策略实施指导手册
- 农田水资源调配与管理方案
- 外墙构造节点处理方案
- 防腐蚀工程进场材料检验方案
- 园路铺装设计与施工技术方案
- 江苏淘宝直播培训
- 2026年数据分析师实操技能考核题库与详解
- 2026年心理学基础理论及应用实践试题
- 2025-2026学年天津市河东区八年级(上)期末英语试卷
- 2026马年开学第一课:策马扬鞭启新程
- 2025年初中初一语文基础练习
- 2026年中央网信办直属事业单位-国家计算机网络应急技术处理协调中心校园招聘备考题库参考答案详解
- 老友记电影第十季中英文对照剧本翻译台词
- 2025年黑龙江省大庆市检察官逐级遴选笔试题目及答案
- 国保秘密力量工作课件
- 影视分镜师合同范本
- 肿瘤患者凝血功能异常日间手术凝血管理方案
- 2025年银行柜员年终工作总结(6篇)
- 电力工程质量保修承诺书(5篇)
评论
0/150
提交评论