![[信息与通信]局域网聊天工具的设计与实现.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-2/23/f060e6f6-5f52-457f-ae03-8141e38fe44a/f060e6f6-5f52-457f-ae03-8141e38fe44a1.gif)
![[信息与通信]局域网聊天工具的设计与实现.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-2/23/f060e6f6-5f52-457f-ae03-8141e38fe44a/f060e6f6-5f52-457f-ae03-8141e38fe44a2.gif)
![[信息与通信]局域网聊天工具的设计与实现.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-2/23/f060e6f6-5f52-457f-ae03-8141e38fe44a/f060e6f6-5f52-457f-ae03-8141e38fe44a3.gif)
![[信息与通信]局域网聊天工具的设计与实现.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-2/23/f060e6f6-5f52-457f-ae03-8141e38fe44a/f060e6f6-5f52-457f-ae03-8141e38fe44a4.gif)
![[信息与通信]局域网聊天工具的设计与实现.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-2/23/f060e6f6-5f52-457f-ae03-8141e38fe44a/f060e6f6-5f52-457f-ae03-8141e38fe44a5.gif)
已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科生毕业论文论文题目: 局域网聊天工具的设计与实现 外文题目: The design and realization of the LAN chat implement 学生姓名: * 学生学号: * 专业班级: 计算机科学*学院名称: 计算机信息* 指导教师: *教授 声明 本人郑重声明:所呈交的论文是本人在老师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。摘要 本论文所设计的局域网聊天程序将采用软件工程学的设计流程,其所涉及专业技术主要包含socket网络编程,ODBC数据库编程技术,Windows MFC 程序设计技术,多线程机制。本程序将以VC 6.0作为系统开发工具,Microsoft SQL Sever 2000作为后台数据库管理系统,通过Microsoft操作系统自带的ODBC管理工具连接程序和数据库。此聊天程序将采用C/S模式即客户端/服务器模式。客户端和服务器、客户端和客户端之间均采用UDP进行通信。服务器主要负责储存局域网内所有用户的信息,当用户信息发生变化时通知所有客户端。此外服务器还要负责分配用户的惟一标识Uid。除此之外,服务器还能注销用户和群发系统消息。客户端具有用户注册、用户登录和向局域网内任何一个用户发送信息的功能。客户端需手动输入服务器地址。关键词:局域网聊天;socket(套接字);ODBC(开放数据互连);客户端/服务器模式;MFC(微软基础类);多线程;UDP(用户数据报协议)AbstractThe LAN chat program in this article will use the design procedure of the Software Engineering to design with Socket Network Programming,ODBC Database Programming,Windows MFC Programming,Multithread.This program will adopt VC 6.0 as the system Develpoment tool,and SQL Sever 2000 as the databse management system,while the ODBC management tool belong to Microsoft Operating System is used to link the program and databse.This chat program will be based on C/S architecture.The communication between client and server or client and client will depend on the UDP protocol.The Server is in charge of storing the information of all the users int the LAN,and notify all the users while the information change.Except that,what the Sever will do is to assign the Uid which one is the only mark of client user,delete user and send system message to all users.The Client is in charge of user register,user log on and chatting with any one else in the LAN.The Client need to manually input the address of the Server.Key words:LAN chat,socket,ODBC,C/S,MFC,multithread,UDP目录声明I摘要IAbstract1 引言11.1课题背景及意义11.2 课题现状11.3 开发平台及开发技术的介绍11.3.1 VC+6.0 开发平台介绍.11.3.2 Windows Socket网络编程简介.22 需求分析及可行性研究22.1 需求分析.22.1.1 功能需求分析22.1.2 数据需求分析22.1.3 性能需求分析22.1.4 运行需求分析22.2 可行性研究.23 相关开发技术的原理性说明33.1 win32编程原理及MFC框架.33.1.1 win32编程原理33.1.2 MFC框架43.2 TCP/IP协议及WINDOWS SOCKETS网络编程接口43.2.1 TCP/IP协议简介43.2.2 Windows Sockets 网络编程接口43.3 多线程技术53.3.1 进程及线程概述53.3.2 Win32 API 对多线编程的支持63.4 MFC ODBC数据库访问技术73.4.1 ODBC 简介73.4.2 MFC封装的ODBC数据库类73.4.3 应用ODBC编程方法介绍84 总体设计.94.1 体系结构设计94.2 功能模块设计94.3 数据结构设计105 详细设计与编码实现.115.1 服务器详细设计115.1.1 服务器界面设计115.1.2 服务器通信模块设计155.2 客户端详细设计.235.2.1客户端界面设计235.2.2客户端通信模块设计306 测试426.1 功能性测试.42.6.2 容错性测试.42参考文献42- 43 -1 引言1.1课题背景及意义随着计算机科学技术的飞速发展,网络越来越深刻的改变着人们生活方方面面。各种基于网络的应用技术在人们的政治、经济、生活等的各个方面都发挥着重要的作用。例如QQ,MSN等基于Internet的即时聊天工具。这些工具通过网络这个新兴的媒介进行信息交流相比其他传统媒介具有数据量大,实时性强,操作简单,成本低廉等优点。不仅如此即时聊工具还具备许多传统媒介不具备的强大功能,它们能传送文字、声音、影像和文档,而且能更加人性化的显示联络人的名单和通信状态。因而它们在现实生活中受到了广泛的欢迎,这是有目共睹的。目前基于Internet的即时聊天工具已经做的非常完美,然而基于局域网的即时聊天工具却不如人意。而在高等教育方面,网络展现出不可替代的作用。为了适应现代信息化,教学局域网 张勇.教学局域网安全分析.网络安全技术与应用J.2010-3就应运而生。而教学局域网内的即时通信能力则显得尤为重要。所以对于学校和公司内部网络等机构,局域网即时聊天的应用还是相当重要的。一个好的局域网通信软件将对学校和公司的运作产生积极的影响。1.2 课题现状基于局域网的即时通信软件的核心技术其实与基于Internet的即时通信软件的设计技术是一样的,只是规模较小。基于Internet的通信工具一般是采用UDP或TCP协议来实现的,开发技术已经非常成熟。比如QQ、MSN等等,它们都是基于Internet的即时通信软件,它们不仅实现了即时聊天、文件传输等功能,而且还能够实现网络即时视频、语音聊天功能。它们的功能正在不断扩充,使其更加人性化,满足人们更多的需求。这类软件其实都是在下层协议的基础之上,通过网络通信接口进行设计的软件产品。在局域网内,这类软件的设计比在Internet中设计更为简单。因为Internet是网络的网络,结构更为复杂,碰到的状况比在局域网中要多。而局域网中事情就简单的多了,所以局域网聊天工具在实现即时通信时就相对容易些了。1.3 开发平台及开发技术的介绍1.3.1 vc+6.0开发平台介绍Visual C+是当今被广泛使用的可视化编程环境之一,它为我们提供了方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了可重复利用的完整的面向对象程序语言。而VC 6.0是Visual C+的一个比较成熟的版本,作为一个学习程序设计和进行系统开发的软件,它都做得不错。本人在校期间也是一直使用VC 6.0来学习程序设计,所以对它比较熟悉。同样作为微软开发的软件系统,用它来开发Windows 应用程序则更加得心应手。1.3.2 Windows Socket网络编程简介Windows Socket 是一个网络编程接口 孙海民.精通Windows Sockets网络开发基于Visual C+实现.人民邮电出版社.2008.7。虽然它并不是协议,但是它可以访问很多种网络协议。它可以看作是一些协议的封装,而且它已经基本实现了协议无关性。对于TCP/IP协议,windows socket主要采用UDP或TCP来进行通信。UDP协议是一种不可靠的、无连接的传输协议,而TCP则是一种可靠的、面向连接的传输协议。2 需求分析及可行性研究2.1 需求分析2.1.1 功能需求分析程序要实现的功能:程序启动之后要能够知道局域网内哪些用户在线,并可以与之通信;一旦某个网内用户上线或离线,需要立即更新信息,并通知所有在线用户;当双击用户列表中某个列表项时,要能够弹出信息发送框,并可以编辑要发送的信息,然后发送;当收到信息时,需弹出信息接收框,显示用户接收到的信息,并知道是谁所发。2.1.2 数据需求分析对于局域网内的用户需要具体的数据信息来表示,服务器则需要一个保存所有用户信息数据表,其基本内容应包括用户ID,用户名,密码,状态,及IP地址。2.1.3 性能需求分析首先要保证程序的可靠性,可以应对各种由于系统问题产生的错误,比如网络连接失败,信息发送失败。要求尽可能多的预防此类事情的发生,并准备好应对措施和向用户提供的提示信息。另外要保证程序有一定的容错性,当用户进行非法操作或系统本身出现错误时要能以合适的方式退出程序。2.1.4 运行需求分析由于此程序将采用MFC框架进行设计,所以此程序必须运行于装有VC系统的Windows操作系统中。服务器端则需要SQL Sever 2000数据库管理系统对用户数据进行管理,并能进行数据收发;客户端则只要能够进行数据收发即可。2.2 可行性研究本软件只是做开发学习之用,所以不必考虑成本问题。由于在软件设计之前,已经做好了需求分析以及充分的前期准备工作。确定了本程序的平台为Windows,将要使用udp socket进行网络通信,此程序的开发系统为VC。而VC开发Windows程序的能力有目共睹的。因此此程序在开发的技术可行性上是完全行得通的。3 相关开发技术的原理性说明3.1 win32编程原理及MFC框架3.1.1 WIN32编程原理 杨祥金.Windows程序设计教程.清华大学出版社M.2007.4.所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。下面是进行直接的WIN32 SDK方式编程的基本思路或者说是一个框架:一个WINDOWS程序分为程序代码和UI(User Interface 用户接口)资源两大部份,两部份最后以RC编译程序整合为一个完整的EXE文件。所谓UI资源是指功能菜单、对话框、程序图标、光标形状等等东西。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur等等。程序员必须在一个所谓的资源描述档(.rc )中描述它们。RC编译器( RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.RES 文件,再与程序代码结合在一起,这才是一个完整的 Windows可执行文件。与控制台程序相同的是,一个WIN32程序也必须有一个程序入口点,但是在这儿它不再叫main(),而叫做WinMain(),当WINDOWS的SHELL检测到用户欲执行一个EXE程序,就会调用加载器把程序进行加载,然后调用C startup code,后者再调用WinMain(),程序的执行就开始了。WinMain()函数的原型为:Int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);程序必须进行的初始化工作产生窗口,第一步是注册一个窗口类:用API函数RegisterClass(),而这个函数需要一个已经定义好的系统结构WNDCLASS。这个结构里面定义了窗口的种种属性,需要自己定义,但是许多属性都有默认值。然后调用CreateWindow()函数来产生具有上述定义属性的已注册窗口,但是需要注意的是它只是生成窗口,但并不显示之,所以还需要调用一个函数ShowWindow()将它显示在屏幕上,做完这些初始化工作以后,系统将进入消息循环:while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);当消息循环捕捉到消息以后将交由窗口函数WndProc()窗口函数进行相应的处理。这样,一个基于消息事件驱动的WIN32程序的雏形就建立了起来。3.1.2 MFC框架MFC其实就是Microsoft Foundation Classes,又称微软基础类库 谢勇.Visual C+ 6.0实例精通M.科学出版社.2000.5.。它是VC开发环境的一个核心构件。构建一个基于MFC框架的程序,可以使用MFC的向导程序。一个基于MFC的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同的程序属性。使用其向导以及控件编程,使得不论是界面编写,还是程序内核设计,都更加的简单。其中有合理的消息映射机制,有方便的运行时类型识别功能,更有文档/视图结构设计,文档串行化功能等非常多的优秀功能。3.2 TCP/IP协议及WINDOWS SOCKETS网络编程接口3.2.1 TCP/IP协议简介 James F.Kurose.Computer Networking-A Top-Down Featuring the InternetM.人民邮电出版社.2004.1TCP/IP协议实际上是一个目前被使用最广泛的协议簇,它为网络中的主机通信提供了从上到下的完整的通信规范。它主要包括以下几层:应用层,传输层,网络层,数据链路层,物理层。它每层都会包含一些协议。其中最主要的协议就是IP协议和TCP协议。IP协议又称网际协议,它是网络层的协议。它主要负责网络中数据的路由转发同时为上一层传输层的协议提供底层服务。IP协议是一种不可靠的协议,不会对差错进行控制。但它可以借其他协议来实现可靠传输功能。例如ICMP协议,又叫网际控制报文协议。它的主要功能是当主机或路由器出现异常时,返回异常信息。TCP协议又称传输控制协议,它是一个传输层协议。它为主机之间提供端到端的可靠的数据传输。而本课题所采用的UDP协议也是传输层协议,只是它提供的是无连接的,不可靠的数据传输。3.2.2 WINDOWS SOCKETS网络编程接口 丁展,刘海英.Visual C+网络通信编程实用案例精选M.人民邮电出版社.2004.4之前已经说过,windows sockets是封装了协议的编程接口。它让程序开发人员在进行网络编程时更加直观的进行通信,不用在乎协议的细节。现在就介绍几个最常用的Windows socket API。WSAStartup():初始化。函数原型:int PASCAL FAR WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);为了完成一系列初始化操作,每一个使用Windows Socket的应用程序都必须进行WSAStartup()函数调用,并只有在成功地完成调用之后才能使用Socket。Socket():创建一个Socket。函数原型:SOCKET socket(int af,int type,int protocol);所有通信在建立之前都要创建一个Socket,type是表示Socket的类型,当采用流连接方式时用SOCK_STREAM,用数据报文方式时用SOCK_DGRAM。Bind():为创建的Socket指定通信对象。函数原型:int bind(SOCKET s, struct sockaddr_in *name,int namelen);Listen():设置等等连接状态。函数原型:int listen(SOCKET s,int backlog);对于服务器的程序,当申请到Socket,并指定通信对象为INADDR_ANY之后,就应该等等一个客户机的程序来要求连接。Accept():接受连接请求。函数原型:SOCKET accept(SOCKET s,struct sockaddr_in *addr,int *addrlen);Connect():对于客户程序,要主动提出连接请求,应使用connect()函数。函数原型:int connect(SOCKET s,struct sockaddr_in* name,int namelen);当采用TCP进行通信时,收发数据的函数为:int send(SOCKET s,char* buf,int len,int flags);int recv(SOCKET s,char* buf,int len,int flags);当采用UDP进行通信时,收发数据的函数为:int recvfrom(SOCKET s,char* buf,int len,int flags,struct sockaddr_infrom,int *formlen);Int sendto(SOCKET s,char* buf,int len,int flags,struct sockaddr_into, int *tolen);Closesocket():关闭socket。函数原型:closesocket(SOCKET s);3.3多线程技术3.3.1 进程及线程概述 胡鸣.Windows 网络编程技术M.科学出版社.2008.6进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C+ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。3.3.2 Win32 API对多线程编程的支持Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明:(1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。(2) DWORD SuspendThread(HANDLE hThread);该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。(3) DWORD ResumeThread(HANDLE hThread);该函数用于结束线程的挂起状态,执行线程。 (4) VOID ExitThread(DWORD dwExitCode);该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。 (5) BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 (6)BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。3.4 MFC ODBC数据库访问技术谢勇.Visual C+ 6.0实例精通M.科学出版社.200.1 ODBC 简介ODBC是一种使用SQL语言的程序设计接口。使用ODBC让应用程序的开发人员避免了与数据源交互的复杂性。这项技术目前已经得到了大多数DBMS厂商们的广泛支持。3.4.2 MFC封装的ODBC数据库类Visual C+6.0的MFC基类库定义了几个数据类。在利用ODBC编程时,经常要用到Cdatabase(数据库类),CrecordSet(记录集类)和CrecordView(可视记录集类)。1,Cdatabase 类对象提供了对数据源的连接,通过它可以对数据源进行操作。2,CrecordSet类对象提供了从数据源中提取出的记录集。CrecordSet 对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能保持与其他用户所做的更改保持同步(即可以修改数据库中的记录);快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或是本应用程序中的其他记录集对该记录所做更改会相应地显示出来。3,CrecordView类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CrecordSet对象的表视图。3.4.3 应用ODBC编程方法介绍应用程序与数据库建立连接,可以使用Cdatebase:OpenEx()或Cdatabase:Open()函数来进行初始化。数据库对象必须在使用它构造一个记录集对象之前被初始化。下面介绍VC中ODBC的基本编程技巧:1,查询记录查询记录使用CrecordSet:Open()和CrecordSet:Requery()成员函数。在使用CrecordSet类对象之前,必须使用CrecordSet:Open()函数来获得有效的记录集。2,增加记录增加记录使用AddNew函数,要求数据库必须是以允许增加的方式打开,示例如下:m_pSet-AddNew();m_pSet-SetFieldNull(&(m_pSet-m_type),false);m_pSet-m_type=”电动机”;m_pSet-Update();m_pSet-Requery();3,删除记录直接使用Delete函数,并且在调用Delete函数之后不需调用Update函数,示例如下:m_pSet-Delete();if(!m_pSet-IsEOF() m_pSet-MoveNext();else m_pSet-MoveLast();4,修改记录 修改记录首先使用Edit函数,然后调用Update函数,示例如下: m_pSet-Edit(); m_pSet-m_type=”发电机”; m_pSet-Update(); m_pSet-Requery();以上就是对数据库的几种基本操作方法。4 总体设计4.1体系结构设计一般的通信工具,都采用客户端/服务器体系结构,本程序也不例外。客户端/服务器结构的具体结构是这样的:它包含客户端和服务器端;客户端访问和处理服务器上的数据,服务器接收和处理客户端的数据请求。这种模式的好处就是可以将一个系统分为两个独立的部分进行开发设计,便于软件开发。而且也把一个软件的功能交给两个部分去完成,则更加有效的利用了系统资源。在本程序中,将不只是简单的客户端/服务器模式。由于本程序是聊天程序,不仅客户端要服务器进行通信,客户端之间也要通信。而本程序的客户端的通信方式是绕开服务器,让客户端进行直接通信。而服务器的主要任务是让客户端能够了解其他的客户端的存在,并知道如何与它们进行通信。总之,本程序中客户端不仅是服务器的客户端,还是其他客户端的服务器端。具体结构如图4-1。图4- 1系统总体结构4.2功能模块设计由于本系统采用C/S模式,所以对功能模块进行划分时,就需要分服务器和客户端两部分进行。由于服务器的主要功能是启动服务器之后显示所有用户的信息和等待接收并反馈客户端的信息,所以服务器需要信息输出模块和通信模块。其中通信模块包含信息发送模块和信息接收模块。而信息输出模块要做到当信息发生改变时及时更新。客户端同样也需要通信模块和信息输出模块,但由于客户端需要主动的发送信息,所以还需要一个信息输入模块。具体模块划分如图4-2。图4- 2系统功能模块划分4.3数据结构设计本程序所涉及数据结构主要包括用户信息表和程序之间通信所使用的信息的格式。由于本程序将SQL Sever 2000作为后台数据库,所以对于用户信息表只需要在数据库中建立一张表。表的格式如下:列名 数据类型 长度Uid int 4Username char 10Password char 15Statue bit1Ipaddr char 20程序通信信息格式比较复杂,需要在设计程序之前就定义好,然后还需要程序自己去识别。这里的方法是添加信息首部。不同的消息设定不同的首部,那样就很好理解了。信息可根据接收方的不同可分为服务器端信息和客户端信息。服务器端信息用户登录信息:1#信息正文用户注册信息:2#信息正文用度退出信息:3#信息正文客户端登录框信息登录成功信息:1#信息正文注册成功信息:2#信息正文登录失败信息:3#注册失败信息:4#客户端主界面框信息服务器系统消息:1#1#信息正文服务器注销消息:1#2#信息正文服务器的所有用户消息:1#3#信息正文客户端消息:2#信息正文5 详细设计与编码实现5.1服务器详细设计5.1.1 服务器界面设计本程序是以MFC框架的基于对话框的应用程序模板为设计。所以其用户界面是在模板的基础上进行具体的设计和修改的。服务器的运行界面如图5-1。图5- 1服务器运行界面实现此用户界面所需要的用户变量有:CListCtrlm_list;/用于控制列表框UINTm_Usernum;/用于保存注册用户数UINTm_Onlinenum;/用于保存在线用户数CStringm_ipaddr;/用于保存服务器IP地址UINTm_port;/用于保存服务器开放端口CUserSet1 m_User;CUserSet1* m_uSet;/用于连接数据库具体实现此界面的函数代码如下:初始化列表框:void CServerDlg:InitList()m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_list.InsertColumn(0,_T(UID);m_list.InsertColumn(1,_T(用户名);m_list.InsertColumn(2,_T(密码);m_list.InsertColumn(3,_T(IP);m_list.InsertColumn(4,_T(状态);m_list.SetColumnWidth(0,50);m_list.SetColumnWidth(1,100);m_list.SetColumnWidth(2,100);m_list.SetColumnWidth(3,120);m_list.SetColumnWidth(4,46);m_list.SetTextColor(RGB(0,255,0);初始化数据库连接代码:m_User.Open(AFX_DB_USE_DEFAULT_TYPE,select * from userdata);m_uSet=&m_User;“启动系统服务”按纽与“发送系统信息”按纽之间的切换,并初始化界面信息:void CServerDlg:OnBtnBegin() / TODO: Add your control notification handler code hereUserNum=0;m_uSet-MoveFirst();while(!m_uSet-IsEOF()m_uSet-MoveNext();UserNum+;m_Usernum=UserNum;/向ListCtrl中添加用户信息/CString temp;int i=0;m_uSet-MoveFirst();while(!m_uSet-IsEOF()temp.Format(%d,m_uSet-m_Uid);m_list.InsertItem(i,temp);m_list.SetItemText(i,1,m_uSet-m_username);m_list.SetItemText(i,2,m_uSet-m_password);if(m_uSet-m_statue)m_list.SetItemText(i,3,m_uSet-m_ipaddr);temp=在线;m_list.SetItemText(i,4,temp);elsem_list.SetItemText(i,3,m_uSet-m_ipaddr);temp=离线;m_list.SetItemText(i,4,temp);i+;m_uSet-MoveNext();/隐藏开启服务器按纽显示发送系统信息按纽/CWnd *pWnd=GetDlgItem(IDC_BTN_BEGIN);pWnd-ShowWindow(SW_HIDE); pWnd=GetDlgItem(IDC_START);pWnd-ShowWindow(SW_SHOW);UpdateData(FALSE);更新界面信息:void CServerDlg:RenewList()CString temp;m_Onlinenum=0;UserNum=0;m_list.DeleteAllItems();int i=0;m_uSet-MoveFirst();while(!m_uSet-IsEOF()temp.Format(%d,m_uSet-m_Uid);m_list.InsertItem(i,temp);m_list.SetItemText(i,1,m_uSet-m_username);m_list.SetItemText(i,2,m_uSet-m_password);if(m_uSet-m_statue)m_list.SetItemText(i,3,m_uSet-m_ipaddr);temp=在线;m_list.SetItemText(i,4,temp);m_Onlinenum+;elsem_list.SetItemText(i,3,m_uSet-m_ipaddr);temp=离线;m_list.SetItemText(i,4,temp);i+;UserNum+;m_uSet-MoveNext();m_Usernum=UserNum;UpdateData(FALSE);5.1.2 服务器通信模块设计实现服务器通信所须的数据结构和用户变量:struct Param/创建线程的参数SOCKET socket;HWND hwnd;struct UserData/保存用户信息的数据结构UINT id;CString Name;UINT code;BOOL IsOnline;CString ip;CString userdata;/储存所有用户的信息CString smsg;CString msg;/用于保存发送的信息UINT msgType;/用于指示发送的信息的类型CUserSet1 m_User;CUserSet1* m_uSet;/用于连接数据库SOCKET m_socket;/监听套接字SOCKET m_send;/发送套接字首先要进行通信必须加载套接字库,本程序只需在CseverDlg类的InitInstance()函数中加入如下代码:if(!AfxSocketInit() MessageBox(NULL,套接字库加载失败!,Error!,MB_OK); return FALSE; 然后初始化套接字:BOOL CServerDlg:InitSocket()m_socket=socket(AF_INET,SOCK_DGRAM,0);if(m_socket=INVALID_SOCKET)MessageBox(套接字创建失败!);return false;char hostname50;int result;result=gethostname(hostname,50);if(result!=0)MessageBox(主机查找失败!,Error!,MB_OK);return false;HOSTENT* hst=NULL;struct in_addr ia;CString m_strip=;hst=gethostbyname(LPCTSTR)hostname);memcpy(&ia.s_addr,hst-h_addr_list0,sizeof(ia.s_addr);m_strip.Format(%s,inet_ntoa(ia);CWnd *p=GetDlgItem(IDC_IPADDR);p-SetWindowText(m_strip);m_ipaddr=m_strip;p=GetDlgItem(IDC_PORT);p-SetWindowText(6020);m_port=6020;SOCKADDR_IN SevAddr;SevAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);SevAddr.sin_family=AF_INET;SevAddr.sin_port=htons(6020);result=bind(m_socket,(sockaddr*)&SevAddr,sizeof(SOCKADDR);if(result=SOCKET_ERROR)MessageBox(套接字绑定失败!);closesocket(m_socket);return FALSE;return TRUE;此函数不仅初始化了套接字并将m_socket与端口6020进行了绑定,还获取主机的IP地址。之后就可以创建监听线程对6020进行监听并准备接收和处理数据。线程创建代码:Param *p=new Param;p-hwnd=m_hWnd;p-socket=m_socket;HANDLE handle=:CreateThread(NULL,0,RecvProc,(LPVOID)p,0,NULL);CloseHandle(handle);线程主体函数:DWORD CServerDlg:RecvProc(LPVOID lpParameter)HWND hwnd=(Param*)lpParameter)-hwnd;SOCKET socket=(Param*)lpParameter)-socket;char buf200;SOCKADDR_IN Cliaddr;int len=sizeof(SOCKA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育心理学实践游戏化学习对学习成效的影响
- 内窥镜技术在医学人才培养中的运用研究
- 大连银行外部专家招聘笔试真题2024
- 2024年江苏公务员考试试题及答案
- 2025年中国运动结晶缸行业市场调查、投资前景及策略咨询报告
- 2025年中国膨胀石墨增强填料环行业市场调查、投资前景及策略咨询报告
- 2025年中国纯锡奖盘行业市场调查、投资前景及策略咨询报告
- 2025年中国空滤器总成行业投资前景及策略咨询研究报告
- 2025年中国直流电动机换热器行业市场调查、投资前景及策略咨询报告
- 2025年中国电子天平配打印机行业投资前景及策略咨询研究报告
- 习近平总书记关于应急管理的重要论述
- 2025年3月10日吉林省纪委监察厅遴选面试真题及解析
- 期末试卷(试题)(含答案)-2024-2025学年一年级下册数学北师大版
- 2024年地理中考模拟考试地理(贵州贵阳卷)(A4考试版)
- 上海浦东新区公办学校储备教师教辅招聘笔试真题2022
- 国开(甘肃)2024年春《地域文化(专)》形考任务1-4终考答案
- 安全生产月“一把手”讲安全课件
- Grace评分表、TIMI评分、CRUSAD评分、wells评分等
- 洗洁精-MSDS(202334)
- 金日-冷却塔与节能
- 物业公司工程部工作职责.doc
评论
0/150
提交评论