毕业设计(论文)局域网信息发布程序的设计与实现_第1页
毕业设计(论文)局域网信息发布程序的设计与实现_第2页
毕业设计(论文)局域网信息发布程序的设计与实现_第3页
毕业设计(论文)局域网信息发布程序的设计与实现_第4页
毕业设计(论文)局域网信息发布程序的设计与实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、延边大学本科毕业论文局域网信息发布程序的设计与实现作 者 院 系 理工学院 计算机系 专 业 科学与技术专业 年 级 2001级 学 号 指导教师 职 称 讲师 答辩日期 2005年6月11日 目 录摘要.3英文摘要.4一、绪论.5(一)背景介绍.5(二)相关知识.5二、需求分析.9(一) 可行性分析:.9(二) 系统综合要求: .9(三) 系统数据要求: .10三、总体设计.12(一) 层次图.12(二) 系统构架图.13(三) ipo图.14四、详细设计.16(一) 服务器端设计方案 .16(二) 模块流程图.17(三) 数据库设计.20(四) 共享数据结构设计.20五、关键代码分析.22

2、(一) 编码规则.22(二) 多进程编程 .22(三) 多线程技术.23(四) 主要设计源代码介绍.23六、测试.31(一) 测试的目标和方法.31(二) 软件测试情况.31(三) 界面与功能测试情况.32七、总结.35参考文献.36摘 要本次毕业设计的题目是局域网信息发布程序的实现,是采用redhat linux 作为开发平台,以mysql为数据载体,以vc语言为主要开发语言的一套包括发送消息及附件为主,并提供及时聊天功能的一个综合性软件。主要的功能是基于tcp/ip网络通信技术实现了面向连接的用户与服务器间点对点的通信传输功能,并且应用了多线程以及共享数据结构技术,使网络服务器具有了多用户

3、数据转发的功能,进而解决了局域网多用户间的信息发送的问题。在客户端,用户通过注册/登陆机制进行身份验证并通过通信服务器转发信息以及附件。对于一般采用tcp/ip协议的应用程序只实现了单用户与服务器间点对点的连接,而本文在vc6.0的环境下,运用了多线程以及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息交换问题。关键词: linux mysql socket 多线程 共享数据结构 信息发送abstractthis graduate design is called ”information of lan transmissions achieve” it i

4、s a compositive software including chat and file transfers which takes redhat linux 9.0 as the develop platform, mysql as a data carrier and use vc as the main programme language. the function includes: according to the tcp/ip network communicated technique achieve face to connect user and server po

5、int to point data transfer. and it apply multi-thread and data share technique. it use network server have more users data transmit function. resolve communication of more users of lan. on client, the users use login server enter the personnal interface, make use of communication server transfer dat

6、a and file. about commonly tcp/ip protocols application only achieve connect toone user and server . but in this article we use vc6.0, use multi-thread and share data technique not only achieve connect to more users and server but also more userss communication. key words: linux mysql socket multi-t

7、hread share data structure send message一、 绪 论(一)背景介绍由于因特网的迅速流行,越来越多的应用程序具备了在网上与其它程序通信的能力。从win95开始微软把网络功能融进了它的操作系统,使得应用程序网络通信能力更为普及。因此,微软的tcp/ip协议也就成为网络应用程序基于的首选协议。一般采用tcp/ip协议的应用程序只实现了单用户与服务器间点对点的连接,而我所选择的题目则是应用多线程及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息交换问题。所以说开发的这个软件应该是一个比较实用的,功能比较强大的软件。它的主要功能是基于tcp

8、/ip网络通信技术实现了面向连接的用户与服务器间点对点的通信传输功能,一套包括发送消息及附件为主,并提供及时聊天功能的一个综合性软件。它的开发环境是以redhat linux作为开发平台,以mysql为数据载体,以vc语言为主要开发语言的一个软件。在这次代码的编写中我们主要研究的是网络通信方面的知识1。(二)相关知识1、linux的特性及其优点linux操作系统核心最早源于芬兰赫尔辛基大学一名学生linus torvalds的天才想法,后来经过众多世界顶尖的软件工程师的不断修改和完善,linux得以在全球普及开来,在服务器及个人桌面领域得到越来越多的应用,在嵌入式开发方面更是具有其它操作系统无

9、可比拟的优势,并以每年100%的用户递增数量显示了linux强大的力量,成为unix世界的一朵奇葩。linux是一套免费的32位多用户多任务的操作系统,其稳定性、多任务能力与网络功能已是许多商业操作系统无法比拟的,linux还有一项最大的特色在于源代码完全公开,在符合gnu gpl(general public license)的原则下,任何人皆可自由取得、散布、甚至修改源代码。 linux还具有以下特点:1)采用阶层式目录结构,文件归类清楚、容易管理;2)支持多种文件系统;3)具备高度移植性;4)可与其它的操作系统并存于同一台计算机上。linux的优点也有很多,如下:1)低廉的附加费用;2)

10、根据您的需求灵活定制;3)从许可证的限制中解脱;4)稳定性;5)高性能;6)标准兼容性。2 、 数据库(mysql)及其特点随着计算机技术的飞速发展,计算机用于管理的规模越来越大,应用越来越广泛,数据量急剧增长,传统的数据管理方式(人工管理、文件系统方式)已经远远不能满足人们的要求,数据库技术便应运而生,出现了统一管理数据的专门软件系统数据库管理系统。数据库系统由于其数据结构化、共享性高、冗余度低、易扩充,数据独立性高等优点,在各个领域得到了广泛的应用4。mysql是一个真正的多用户、多线程的sql数据库,是一个客户机/服务器结构的应用,它由一个服务器守护程序mysql同的客户程序和库组成。m

11、ysql的主要目标是快速、健壮和易用。mysql具有以下功能特点:l 可以同时处理几乎不限数量的用户;l 处理多达50,000,000以上的记录;l 命令执行速度快,也许是现今最快的;l 用户名和口令独立于/etc/passwd。这便于cgi的使用;l 使用核心线程的完全多线程支持,这意味着它能利用多cpu;l 支持多种语言开发,例如c c+ java php;l 支持多字节类型,包括1 2 3 4 8字节长度的有符号、无符号整数;l 全面支持sql。3、 vc简介3.1、 vc的特性虽然vc比较难学,尽管也是visual的,但很多地方需要手工编写代码,但其开发后生成的程序质量比较高。vc编译

12、后的速度较快,不需要庞大的运行时间库支持,软件发行也不是困难;而且底层调用手段较多,适合开发硬件操作多、速度要求高的场合,比如编写硬件驱动程序等等。3.2、 vc+与网络编程vc+对网络编程的支持有socket支持,wininet支持,mapi和isapi支持等。其中,windows sockets api是tcp/ip网络环境里,也是internet上进行开发最为通用的api。在tcp/ip网络通信环境下,socket数据传输是一种特殊的i/o,它也相当于一种文件描述符,具有一个类似于打开文件的函数调用-socket()。可以这样理解:socket实际上是一个通信端点,通过它,用户的sock

13、et程序可以通过网络和其他的socket应用程序通信。socket存在于一个"通信域"里,并且与另一个域的socket交换数据。socket有三类。第一种是sock_stream(流式),提供面向连接的可靠的通信服务,比如telnet,http。第二种是sock_dgram(数据报),提供无连接不可靠的通信,比如udp。第三种是sock_raw(原始),主要用于协议的开发和测试,支持通信底层操作3。4、数据通信的种类4.1、tcp/ip(传输控制协议)它是由socket类实现,并且它提供的是一种可靠的、面向连接的数据传输方式,不管是对单个的数据报还是对数据包,流式套接字都提

14、供了一种流式数据传输。tcp接收传输协议数据包并把它们传递到表示层。并把信息分解成数据包(datagrams) 并在接收端重新组装起来。它还对丢失的数据包进行重新传输的请求5。4.2、udp(用户数据报协议)由datagramsocket类实现数据报套接字,它提供的是一种不可靠的非连接的数据包通信方式,不可靠的意思是发送一个数据包不能保证被接收方接收,也不保证数据包按照发送顺序到达接收方,虽然它使你的应用程序更有效率,但只有在你的应用程序并不是立即交流大量数据并且不需要组装大量的数据报而完成一条消息的时候才使用5。基于上面两种方法的比较,我选择的是tcp/ip协议作为这次开发的协议,用他来控制

15、传输数据。5、 小组分工在局域网信息发布程序的设计与实现中本人负责服务器部分的代码设计与编写。二、需求分析(一) 可行性分析可行性分析的目的是为了用最小代价在最短时间内确定问题是否能够解决。可行性分析的实质就是要进行一次压缩简化系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程1。(1)技术可行性:这个软件通用,可行。(2)经济可行性:这个软件的经济效益会远大于开发成本,可行。(3)操作可行性:linux系统/windows系统和mysql为大家所熟知,比较易于操作,这个软件也易于使用,可行。(二) 系统综合要求需求分析的基本任务是准确的回答“系统必须做什么?”1

16、这个问题。这一阶段是对系统认识最为全面、准确、清晰、得体的一个比较关键的时期。需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。因此,必须用行之有效的方法对软件需求进行严格的审查验证,为下一步的总体设计打好基础。2.1 、系统功能要求需求分析的基本任务是准确的回答“系统必须做什么?” 功能:1) 注册会员于登录服务器,并把相关会员信息写入数据库中,在登陆时要进行身份验证。2) 建立多用户间的通信连接。3) 用户间消息和文件的传送和接收。4) 附件与文字同时发送。2.2、 系统性能要求时间性能要求:在实际应用中可能需要多用户间信息互发的问题,客户端的大量频繁的访问,服务器响应时间

17、应该尽可能缩短,对于有特殊需求的应用,还要求达到实时响应。存储性能要求:根据应用中的实际情况配置适当容量的存储设备。稳定性安全性要求:要求软件尽可能的稳定,对于一般的应用系统,对安全性要求不高,对于特殊的应用,还需要在安全性方面加以保证,所以要相应提高服务器端的配置。2.3、 系统运行要求服务器端: linux系统和mysql服务器。server:用于接收/转发数据,连接数据库及应用程序。客户端: 多个pc机,通信用,作为数据发生器。2.4、 将来可能提出的要求在实际应用中,用户的要求随时可能发生变化,如需要更改数据库信息,改变通信参数,增加访问量以及需要提高系统的性能要求等等。为了减少软件改

18、写的难度,提高软件的可维护性,在设计时要考虑到以上的种种可能性,提高程序的可读性和易扩充性。(三) 系统数据要求数据流图是描绘系统的逻辑模型,描绘信息在系统中流动和处理的情况。数据流图是逻辑系统的图形表示,非常容易理解,所以是极好的通信工具,同时,设计数据流图只需要考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计的很好的出发点1。下面是我们设计的数据流图: 图2-1数据流图因为数据流图是描绘信息在系统中流动和处理的情况,所以首先说明一下这个数据流图的作用:局域网信息发布的起点与终点都是用户自己本身,也就是发起者与接收者都是用户自己。进入我们的程序后,首先

19、用户要自己判断是这册用户还是登录用户,想成为会员首先就要注册成为会员,这样就进入了注册信息这个阶段,填写注册用户的基本信息,详细信息。判断该信息是否有人注册,如果注册信息成功,则把用户的注册信息写入在数据库中,也就是更新我们的数据库信息并保存数据,反馈给用户注册成功的信息,用户就进入登录界面进行登录,进入到客户端后,用户可根据相应的要求发送信息、附件等给用户。并且这些信息与附件相应的通过通信服务器转发,并保存2。上面就是这个数据流图的过程,用户与用户之间的联系,用户与服务器的联系,都表现了出来。三、 总体设计经过了需求分析阶段的工作,系统必须“做什么”的问题已经清楚了,现在是决定“怎么做”的时

20、候了。总体设计的基本目的就是回答“概括得说,系统应该如何实现?”这个问题,因此,总体设计又称为概要设计或初步设计。通过这个阶段的工作,将划分出组成系统的各个物理要素程序、文件、数据库、人工过程和文档等等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后进行详细设计。总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系1。(一)层次图层次图用来描绘软件的层次结构,通过它我们可以更清晰的看到软件的模块组成情况。根据我们这个题目的设计,我们相应的把设计划分成下面几个大的模块5。一个模块是注册登录服务器,它包括用户注册、登

21、录以及数据库管理这三个功能,启动注册登录服务器,判断用户是注册还是登录,注册则进入注册部分,并保存数据于数据库中,登录则直接从数据库调出数据,登录进入客户端通信。另一个模块是通信服务器模块,它负责完成数据转发以及共享数据结构的管理;主要是用户之间信息发送的转发问题,服务器接收到用户端发来的消息后,提取消息的一部分与共享数据结构存储的内容进行比较,确定所要转发的对象,最后通过多线程及其通信机制完成数据转发。客户端这个模块,它的主要功能就是用户的注册,登陆,信息发送与附件的发送。数据库模块,它记录了用户注册的基本信息,详细信息,并通过它来反馈给注册登陆服务器,验证用户是否已经注册,以及提取正确的信

22、息;还有就是保存了用户间发送的信息与附件。局域网信息发布系统 注册/登陆服务器模块模块客户端通信服务器模块数据库模块登陆用户注册数据库管理登陆注册发送信息数据转发用户信息共享数据图3-1层次图(二) 系统构架图系统构架图是整个程序的关键所在,也是整个程序的灵魂,我们的设计就是按照这个整个的系统构架图所做的,它有着很重要的作用6。下面这个就是我们设计的系统构架图:图3-2系统构架图用户进入程序后,启动注册/登录服务器,注册/登陆服务器接收到用户端的信息后,首先判断是注册信息还是登陆信息;应为用户首先必须要注册才能使用这个软件,所以启动注册界面,进入注册界面后,填写用户的基本信息,详细信息,通过注

23、册登录服务器把数据传给数据库,如果注册成功则把数据存储到数据库中,如果注册不成功则给用户返回失败的消息框(期间有任何异常产生,服务器都会返回注册失败消息,提示用户重新注册),数据库要判断用户注册信息是否重复、是否符合标准,如成功,数据库更新数据库的内容并反馈给用户注册成功的消息,这样用户就可以根据刚才注册的信息到登录界面登陆进入到客户端的主界面,通过主界面用户可以通过通信服务器给相应的用户发送信息与附件。用户的信息发送是通信服务期通过访问共享数据结构,由共享数据结构控制转发用户所发的信息。(三) ipo图ipo图是输入/处理/输出图的简称,它是美国ibm公司发展完善起来的一种图形工具,能够方便

24、地描绘输入数据、对数据的处理和输出数据的关系,有了它,模块间的相互关系就显而易见了1。输入 处理 输出 图3-3 ipo图就是输入用户注册信息,发送的信息与附件,登录信息等,写入数据库中,初始化数据与网络后,即初始化响应后,判断注册或登录,如信息发送则通过通信服务器转发用户发送的信息或附件,保存进入数据库中。四、详细设计详细设计阶段的根本任务是确定应该怎样具体地实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序1。详细设计阶段的任务还不是具体的编写程序,而是要设计出程序的“蓝图”,以后程序员将根据

25、这个蓝图写出实际的程序代码。因此,详细设计的结果基本上决定了最终的程序代码的质量。考虑程序代码的质量时必须注意,程序的“读者”有两个程序的维护者和普通用户。在软件的生命周期中,详细设计方案、诊断程序错误、修改和改进程序等等都必须能够读懂程序。实际上对于长期使用的软件系统来说,读程序的时间往往要比改写程序的时间还要长很多。因此衡量程序的质量,不仅要看它的逻辑是否正确、性能是否满足要求,更主要的是要看它是否容易阅读和理解。详细设计的目标不仅仅是在逻辑上能正确地反映每个模块的功能,更重要的是设计出的处理过程应该尽可能简洁明了。结构化程序设计技术是实现上述目标的关键技术,是详细设计的逻辑基础。(一)服

26、务器端设计方案1 、注册登录服务器设计首先注册登陆服务器负责的是用户的注册、登陆以及数据库的管理。注册/登陆服务器启动,接收到用户端的信息后,首先得判断是注册信息还是登陆信息。如果是注册信息,则将该数据按预定的格式写入数据库,然后返回注册成功的消息,期间有任何异常产生,服务器都会返回注册失败消息,提示用户重新注册;如果是登陆信息,则从数据中提取用户名和id与数据库中的内容进行比较,如果该用户存在,则返回登陆成功消息,反之,返回登陆失败消息。注册登录服务器采用面向连接的并发式方式,服务器设计成为一个对话框程序。初始化动态库,创建套接字,绑定本地ip地址和端口,并使套接字进入侦听,由于可能产生阻塞

27、,所以不宜在主线程中调用该函数,因而在初始化网络后当用户按下“运行注册登录服务器”按钮后,利用侦听套接字启动注册登录线程进入无限循环,在线程中调用接收函数,用来接受来自客户端的连接请求,每当一个连接请求到来时,都会产生一个新的套接字,利用这个套接字产生一个新的线程与客户端进行通信并读写数据库,通信完毕后关闭该套接字和线程,原来的侦听套接字继续处于侦听状态。2 、通信服务器设计聊天通信服务器设计为无界面的进程(创建时先建一个基于对话框的应用程序,然后把对话框类删除,把app类里面与对话框有关的语句全删除即可创建无界面进程),采用共享数据结构,为每个客户端创建两个线程,实现接收和转发的功能。运用共

28、享数据结构技术及多线程技术,通过i/o端口与用户端连接,实现了数据转发功能。首先,程序初始化网络,接着当用户连接到服务器时,创建接收线程和发送线程,这样就可以实现数据转发。最后,当用户断开连接时,服务器关闭与他的连接,并结束相应的线程。(二) 模块流程图1 、注册登陆服务器模块 注册登陆服务器在对话框初始化的同时完成网络初始化,启动通信服务器以及接收线程,然后判断是否注册信息,如果是注册信息,则根据相应的规则进入注册界面,不论是数据的格式不对,或者期间发生什么错误都会返回注册不成功的字样,并且重新注册,如果成功则把数据写入数据库中并反馈给用户;如果不是注册而是登录,则判断是否登录进入客户端,如

29、果进入客户端则把该用户列入好友列表里边,并反馈用户;如不登录则从好友列表中删除该纪录。图4-1注册登陆服务器流程图2 、通信服务器模块:启动通信服务器并初始化网络,启动接收线程,判断发送的是信息还是附件,或者是信息与附件同时发送,如果是文本信息,则直接通过通信服务器转发给用户,如果是附件则给对方用户发送信息,看对方是否接收。图4-2通信服务器流程图(三) 数据库设计首先我建立的是用户注册登录这个数据库ybchat,根据要求,该数据库中我建立了三个表格,分别是存储用户基本信息的表1,存储用户详细信息的表2,然后对通信服务器也建立了一个表格是用来转发用户发送的信息的,下面对这三个表的结构作一下简单

30、介绍。通过下面三个表格,我们可以清楚的了解各个表格中的各个字段的类型,是否允许空值,码,默认值等信息。表4-1基本信息表: fieldtypenullkeydefaultextraidintnotpri编号(auto_)sexvarcharnot性别usernamevarcharnot用户名agenumbernot年龄passwordvarcharnot密码imagevarcharnot头像表4-2详细信息表: fieldtypenullkeydefaultextraidintnotpri编号(auto_)truenamevarcharyes真实姓名cityvarcharyes城市emailv

31、archaryese-mailtelnumberyes电话表4-3数据存储表: fieldtypenullkeydefaultextraidintnotpri编号(auto_)user1varcharnotuser2varcharnot(四) 共享数据结构设计同一进程中的多个线程共存于同一个线性地址空间,因此,在多线程间共享数据结构是非常容易且方便的。但必须注意的是,对数据结构的访问必须是多线程互斥的,否则数据任意更改将导致不可预料的结果。我们的设计是通过服务器转发技术也就是通过共享数据结构实现线程间的互相通信。这个程序的共享数据结构一共有两个,其中包含了所有登陆用户的一些基本资料,当前服务器

32、接收到的用户端所发送的信息资料,通过接收线程接收用户所发送的信息,通过线程同步,使用cmutex进行数据的传送,每当有用户连接到服务器,服务器就将用户端的一些信息以结构体的形式存入用户列表中;而当服务器接收到用户端发送过来的信息时,就将数据格式化后存入结构体中,通过与结构体列表比较,确定需要恢复的发送线程。这样,服务器就准确地转了发数据。五、关键代码分析完成总体设计和详细设计之后,我们需要把前面设计的“蓝图”用程序语言表示出来,这样才可以交付计算机进行执行。作为软件工程的一个环节,编程是设计的自然结果,因此,程序的质量主要取决于软件设计的质量。但是,程序设计语言的特性和编码途径也会对程序的可靠

33、性、可读性、可维护性、可预测性产生深远的影响。(一)编码规则源程序代码的逻辑简明清晰、易读易懂是程序好坏的一个重要标准,为了做到这一点,应该遵循下述规则:1 简单性原则,不要写一些过于灵活,不易理解的函数;2 适当的注释:这对于提高程序的可读写、可维护性非常有益,将大大减轻后继开发的压力;3 语句构造:每个语句都应该简单而直接,不能为了提高效率而是程序变得过分复杂。4 在设计和编写程序是因该仔细考虑输入/输出的方面。5 不要牺牲程序的清晰性和可读性来提高效率。(二)多进程编程多进程编程是unix的一个特点,并且多进程有很多的优点,下面就是多进程编程的一些优点:1.并行化 ;2.简单有序 ;3.

34、互不干扰 ;4.事务化 。(三)多线程技术 我的代码设计涉及到了多线程技术,是通过多线程来实现我们这次的毕业设计,我们可以把线程看成是一个进程中的一个执行点,每个进程在任何给定时刻可能有若干个线程在运行。一个进程中的所有线程共享该进程中同样的地址空间,同样的数据和代码,以及同样的资源。进程中每个线程都有自己独立的栈空间,和其它线程分离,并且不可互相访问。 在我们的设计里运用多线程技术就可以实现对多用户的支持。即在服务器端,使接收来自用户端的连接请求这步无限循环,每接收一个用户请求,产生两个线程(接收线程和发送线程),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,等待服务器将其唤醒。这两

35、个线程都执行一个无限循环的过程,只有当通信出现异常或用户端关闭连接时,线程才被自身所结束,并且,这两个线程一定是同时生成,同时结束的,也就是说必须是同步的。很显然,每个连接产生两个线程,使得数据转发变的简单,但同时又使得服务器的任务加重。(四)主要设计源代码介绍1 、初始化网络模块初始化网络主要就是首先读取网络配置,使用户知道自己是该注册成为会员还是登录进入客户端,调用wsastartup初始化动态库,socket函数创建套接字,bind函数绑定本地ip地址和端口,listen函数使套接字进入侦听。部分源代码如下所示:bool cchatsvrdlg:initnet()status = wsa

36、startup(makeword(1, 1), &data); / 初始化动态库if (status != 0)/ 看初始化动态库是否成功messagebox("error: wsastartup unsuccessful!", "边延qq", mb_ok);return false;/以下指定一个与某个socket连接本地或远程地址*/memset(&serversockaddr, 0, sizeof (serversockaddr);/创建socket并读取地址.serversocket = socket(af_inet, sock_

37、stream, 0); /初始化socket.status = bind(serversocket, (lpsockaddr)&serversockaddr, sizeof (serversockaddr);/绑定服务器,获取服务器的地址if (status = socket_error)/ 绑定不成功messagebox("error: bind unsuccessful!", "边延qq", mb_ok);return false;status = listen(serversocket, 5);/服务器进行监听。.return true;接

38、着按下run键开始服务器功能,执行reg_load()函数,使服务器始终处于等待连接状态,但这样也使该线程始终阻塞。当有用户连接时,该函数创建一个任务用于处理与用户及数据库的事务。具体任务(详见原始代码文件)。 void cserverdlg:reg_load() while(1)cwinthread* hhandle;clientsocket=accept(serversocket,(lpsockaddr)&clientsockaddr,&addrlen); /等待连接,阻塞hhandle=afxbeginthread(talktoclient,(lpvoid)clients

39、ocket);/有连接时,创建任务 2、 注册登陆服务器设计2.1、 注册登录线程初始化网络之后,当用户按下“运行注册登录服务器”按钮后,利用侦听套接字启动注册登录线程regload(void *s)进入无限循环,在线程中调用accept函数,用来接受来自客户端的连接请求,每当一个连接请求到来时,accept()函数将产生一个新的套接字,利用这个套接字产生一个新的线程与客户端进行通信。源代码如下:uint regload(void *s)/ 创建线程如果成功则同客户端通信while (1)cwinthread* pthread;clientsocket = accept(serversocke

40、t, (lpsockaddr)&clientsockaddr, &addrlen);pthread = afxbeginthread(talktoclient, (lpvoid)clientsocket);if (pthread = null)/创建线程不成功返回错误 afxmessagebox("error: unable to create thread!", mb_ok);status = closesocket(clientsocket);if (status = socket_error)afxmessagebox("error: clo

41、sesocket unsuccessful!", mb_ok);2.2、启动连接通信进程在启动注册登录线程以后,接受来自客户端的连接请求,并且产生一个新的线程talktoclient(void *cs)与客户端进行通信并读写数据库,通信完毕后关闭该套接字和线程,原来的侦听套接字继续处于侦听状态。创建聊天通信服务器进程,想关闭时则调用terminateprocess(m_hprocchat, 2)函数关闭此进程。源代码如下:void cchatsvrdlg:onbtnrunchat() /启动通信服务器. / start the child process. /创建进程 用转发数据 i

42、f( createprocess( null, / no module name (use command line). ".comsvrcomsvr.exe", / command line. ./通过启动通信服务器转发信息 ) . 2.3、关闭注册/登录服务器线程当用户结束通信后可通过关闭服务器线程来结束此次聊天。源代码如下所示:void cchatsvrdlg:onbtnclose() if (afxmessagebox("真的要关闭注册登录服务器吗?", mb_yesno) = idyes)oncancel();void cchatsvrdlg:

43、onbtnclosechat() if (afxmessagebox("真的要关闭聊天通信服务器吗?", mb_yesno) = idyes)terminateprocess(m_hprocchat, 2);if (waitforsingleobject(m_hprocchat, 1000) = wait_object_0)/当进程终止时有信号.void cchatsvrdlg:ondestroy() /关闭通信服务器cdialog:ondestroy();if (null != m_hprocchat)terminateprocess(m_hprocchat, 2);3、

44、 通信服务器设计3.1、发送消息线程采用的是共享数据结构方式,通过通信服务器进行数据的转发实现。源代码如下所示:uint senddata(void* cs)socket clientsocket=(socket)cs;while(1)if(info_data.data!="close!")m_mutex.lock(); /互锁numsnd=send(clientsocket,info_data.data,info_data.data.getlength(),no_flags_set); /发送数据now=info_data.thread;m_mutex.unlock();

45、 /解锁now->suspendthread(); /自身挂起else goto bb; bb: closesocketlink(lpvoid)clientsocket); /关闭连接afxendthread(0,true); /结束本线程return 1;3.2、接收消息线程它可判断是接收到什么文件,是文字、是文件,以及传输是否成功(收到还是拒绝),并且如果用户不在线,则把信息保存在数据库中,等该用户上线后由服务器通知该用户有信息读取。源代码如下所示:uint recvdata(void* cs) socket clientsocket=(socket)cs;while(1).if(s

46、trcmp(buffer,"close!")!=0) /不是接收的“close”数据 if(po!=null)s1=s_info.getnext(po);if(s1.pet.compare(petname)=0) /比较昵称是否一样m_mutex.lock(); /互锁.m_mutex.unlock(); /解锁s1.thread->resumethread(); /恢复发送相应的线程break;elseif(clientsocket=s1.s_client)m_mutex.lock(); /互锁info_data.data=buffer;m_mutex.unlock

47、(); /解锁s1.thread->resumethread(); /恢复发送相应的线程s_info.removeat(po1); /删除该用户信息break;goto aa;aa: closesocketlink(lpvoid)clientsocket); /关闭连接afxendthread(0,true); /结束本线程return 1;4、 数据库设计在本次数据库设计中,只涉及到了数据的查询、插入;首先说一下服务器与数据库的查询,从数据库中查询注册用户信息是否存在,如果存在则反馈给用户exist,并且结束这次查询,进入下一个查询;首先数据库中查询是按用户名查询的,打开数据库,看是否是数据库的结尾,如果不是结尾则一直查到数据库的末尾,代码如下:cuser rec;rec.m_strsort = "username" /按用户名查询rec.open(); /打开数据库while (!rec.iseof()/若用户名存在则发送exist!if (rec.m_username = username). /如果存在则退出rec.movenext();成功添加一条记录:rec.addnew();/添加用户信息if (rec.update()/添加记录成功发送success!,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论