




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学 号毕业设计(论文)题目:网络五子棋设计与实现 作 者 路南平 届 别 2010 届 系 别 计算机学院 专 业 计算机科学与技术 指导教师 李 焕 职 称 教 授 完成时间 2010年5月30日 摘 要基于VC平台的网络五子棋研究与开发,通过利用面向对象的编程技术,设计可以支持多人对战的五子棋游戏平台。利用Visaul c+进行网络应用程序的开发,利用套接字编程和I/0模型进行实现。本课题开发的网络五子棋系统分为两个模块,即服务器模块和客户端模块。服务器端负责用户信息的维护、通知客户端更新成员列表和通知客户端更新成员状态;客户端负责游戏功能,有登录服务器、向其它用户发出邀请、更新用户列表等功能。系统模块清晰、逻辑简单,是对制开发网络程序的一次有益尝试。本文重点介绍了在实际研究开发过程中采用的一些技术手段,介绍了网络应用程序的开发流程和五子棋程序的分析与设计,并采用面向对象的开发工具VC来具体实现。关键词: 网络 ;套接字;I/0模型;五子棋;Visual c+ABSTRACTVC-based network backgammon platform research and development of object-oriented programming through the use of technology, designed to support the multiplayer game of backgammon game platform. Using Visaul c + + for network application development, using the socket programming and I / 0 model achieve.The subject of the development of network backgammon system is divided into two modules, namely, the server modules and client modules. Server is responsible for the maintenance of user information to inform the client update the members list and notify the client update members of the state; client-side functionality for the game, there login server, an invitation to other users, update the user list and so on. System module clear and simple logic is a system for developing web applications in a useful attempt.This paper focuses on the practical research in the process of developing some of the technical means used to introduce a web application development process and the GoBang program analysis and design, and object-oriented development tool VC + + to implementation Key words: network;socket; I/O model ;GoBang; Visual c+目 录1 五子棋简介五子棋是起源于中国古代的传统黑白棋种之一,五子棋不仅能增强思维能力,提高智力水平,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;既有简单易学的特征,为人们所喜爱,又有深奥的技巧和高水平的国际性比赛。1.1五子棋发展历史五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,增山海经中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳艺经中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。正如辞海中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜。”。l.2 五子棋基本规则1.2.1 传统五子棋传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19X19,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。 1.2.2 现代五子棋随着五子棋的发展,逐步发现先手优势非常大,最后得出“先手必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先手必胜”的问题。“禁手”思维禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先手必胜”。“交换”思维“交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先手必胜”依然存在。1.2.3获胜规则当一方在下面任意一种情况下即为获胜。棋子在水平在线形成连续五子。棋子在垂直线上形成连续五子。其在在斜线上形成连续五子。1.2.4平局规则当先下棋方的棋子出于五子连珠状态时,如果后下棋方最后一步也处于五子连珠状态,则为平局。1.2.5开局规则一方邀请另一方下棋时,被邀请方执黑棋先走,邀请方执白棋后走。l.3五子棋称谓 五子棋,日文亦有“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”等多种称谓,英文则称之为“FIR (Five In A Row的缩写)、Gomoku(日语“五目”的罗马拼音)、Gobang、connect 5、mo-rphion”。捷克语piskvorky,韩语omok许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,暗示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式;美国人喜欢将五子棋称为“商业棋”,也就是说,商人谈生意时可边下棋边谈生意,棋下完了生意也谈成了。l.4网络五子棋发展状况 1997年,伴随着计算机技术和网络技术的发展,世界第一款图形化网络游戏网络创世纪问世。挟计算机与网络技术之高精尖,融传统视听与数码娱乐之精华,集娱乐性、竞技性、仿真性、互动性于一体,网络创世纪迅速风靡全球,备受青睐。 自此拉开了网络游戏的序幕。五子棋在我国的历史可谓是源远流长,喜爱它的玩家也是大有人在。目前主流游戏平台上都有它的踪影,同时在线人数甚至有百万级别。出于对网络编程的热爱,让我选择了网络五子棋作为毕设题目。以Microsoft公司的 Visual C+集成开发环境为工具,运用C+和windows socket语言进行编写代码。编写基于Micosoft平台的网络五子棋,实现多人同时在线游戏功能。2 开发工具的选择目前主流的网络开发工具有Microsoft公司的Visual 系列和Broand公司的Dephi系列、C+Builder系列。Visual C+是一个功能强大的可视化软件开发工具,自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Viusal C+已经成为专业程序员进行软件开发的首选工具。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具,这些组件通过一个名为Developer Studio的组件集成开发环境。Developer Studio是一个通用的应用程序集成开发环境,它不仅支持Viusal C+,还支持Viusal Basic、Visual J+等Microsoft系列开发工具。Visual C+可以用Windows Sockets快速开发网络应用程序,Windows Sockets 规范以U.C. Berkeley 大学BSD UNIX 中流行的Socket 接口为范例定义了一套microsoft Windows 下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket 风格的库函数;也包含了一组针对Windows 的扩展库函数,以使程序员能充分地利用Windows 消息驱动机制进行编程。Windows Sockets 规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供货商共同遵守。此外,在一个特定版本Windows 的基础上,Windows Sockets 也定义了一个二进制接口(ABI),以此来保证应用WindowsSockets API 的应用程序能够在任何网络软件供货商的符合Windows Sockets 协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供货商能够实现的一套库函数调用和相关语义。遵守这套Windows Sockets 规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets 兼容实现的提供者,我们称之为Windows Sockets提供者。一个网络软件供货商必须百分之百地实现Windows Sockets 规范才能做到现Windows Sockets 兼容。任何能够与Windows Sockets 兼容实现协同工作的应用程序就被认为是具有Windows Sockets 接口。我们称这种应用程序为Windows Sockets 应用程序。Windows Sockets 规范定义并记录了如何使用API 与Internet 协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets 实现都支持流套接口和数据报套接口。3基于WINDOWS SOCKET的应用开发介绍 3.1 windows socket简介 应用程序与windows sockets的关系如下图:Windows socket应用程序BWindows socket应用程序A Windows sockets网络通信协议(TCP/UDP) Windows OS 物理通信介质物质质 图1.1 应用程序与Windows Sockets的关系应用程序A和应用程序B进行通信,从用户进程的角度看,这两个应用程序都是通过调用Windows Sockets API来实现数据通信的。从系统或者内核角度看,Windows Sokcets利用下层的网络通信协议、操作系统和物理介质完成了数据的传输。一个套接字就是通信双方的一个端点。一个正在工作的套接字都有与之对应的进程(即应用程序)。应用程序至少可以使用两中套接字:流套接字和数据报套接字。流套接字提供双向有序、无重复并且没有边界记录的数据流服务。数据报套接字虽然支持双向的数据流,但不保证数据是可靠、有序和无重复的。网络服务分面向连接(TCP)和面向无连接(UDP)两种。对于面向连接服务,发送数据的源主机必须首先与目的主机连接。这种连接是通过三次握手建立的,当连接建立后,就可以进行数据传输了,当完成数据传输后释放连接。大部分的面向连接服务能够保证传输数据的正确性。在面向无连接服务中,每个数据分组是在网络上传输的独立单元,称做数据报。发送数据的源主机和目的主机之间没有建立连接的过程,源主机将包含目的地址和源地址的数据报直接发送到网络上,该数据报不能保证正确到达目的主机,通信协议简单,通信效率较高。3.2 IP寻址Windows Sockets提供了与协议无关的编程界面,开发人员可以直接使用任何一种协议的网络应用程序,Windows Sockets中一个重要的方法是IP协议的寻址方法。TCP和UDP协议通过IP协议传输数据。Windows Sockets通过AF_INET地址家族为IP通信寻址,其中“A”代表address,”F”代表family.AF_INET声明如下:#define AF_INET 2网络中每台主机都配有一个IP地址,用一个32位数字来表示。客户端通过TCP或者UDP与服务器通信时,必须指定服务器的IP地址和服务端口号。对于服务器来说,监听客户端的连接请求,也必须指定一个IP地址和一个端口号。在Windows Sockets中SOCKADDR_IN 结构被用来指定IP地址和端口号。该结构声明如下:Struct sockaddr_in Short sin_family; U_short sin_port; Struct in_addr sin_addr; Char sin_zero8; sin_family: 地址家族 sin_port: 服务埠号 sin_addr: in_add类型的IP地址 sin_zero: 填充该结构的大小,使之与SOCKADDR结构大小相同,3.3 基于TCP套接字编程服务器需要等待任意数量客户端的连接,以便为他们提供服务。客户端连接服务器时,必须要知道服务器的名称,在TCP/IP中,这个名称就是服务器的IP地址和端口号,bind()函数实现将一个服务器绑定到一个已知的名字上的功能,接下来需要将服务器状态设置为监听状态,以便监听客户端的连接,这是通过调用listen()函数完成的,在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求,服务器与客户端完成连接后,就可以进行数据通信了。基本流程图如下图所示: Server 服务器端 client 客户端 创建套接字创建套接字绑定连接监听接受连接收发数据收发数据关闭关闭 图1.2 TCP 客户端/服务器端 基本流程示意图3.4 基于UDP套接字编程与面向连接的协议比较,面向无连接协议极为不同,其中一个重要的不同点就是客户端与服务器端之间不必建立连接。服务器创建套接字后,调用bind()函数将套接字与准备接受数据的接口绑定在一起。和TCP编程不同,应用程序不需要调用listen()和accept()函数等待客户端的连接,而只需要等待接受数据。对于客户端,创建套接字后不必与服务器建立连接,而是直接向服务器发送数据。基本流程如下图所示: Server 服务器端 client 客户端创建套接字创建套接字绑定发送资料接收数据关闭关闭 图1.3 UDP 客户端/服务器端 流程示意图3.5 阻塞模式与非阻塞模式 Windows Sockets分别提供了套接字模式和套接字I/O模型,可以对一个套接字的行为进行控制。套接字模式用于当一个套接字被调用时,决定调用函数的阻塞行为。套接字模式有阻塞模式和非阻塞模式。套接字I/O模型描述了一个应用程序如何对套接字上的I/O进行管理。3.5.1 阻塞模式 在阻塞模式下,在I/O操作完成前,执行的操作函数将一直等候而不会立即返回,该函数所在的线程会阻塞在这里。 在阻塞模式的套接字上,调用任何一个Windows Sockets API都会耗费不确定的等待时间。在调用recv()函数时,发生在内核中等待数据和复制数据的过程如下图所示:内核 无数据准备好 等 待 数据准备好复制数据 将 数据 复制 到 用户 空间完成拷贝应用进程Recv()处理数据报cj 系统调用 返回成功指示 图1.4 阻塞模型当调用recv()函数时,系统首先检查是否有准备好的数据。如果数据没有准备好,系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接字应用程序中,当调用recv()函数时,用户空间未必就已经存在数据,此时recv()函数就会处于等待状态。当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的,这意味着当调用Windows Sockets API不能立即完成时,线程处于等待状态,直到操作完成。使用阻塞模式的套接字开发网络程序比较简单,易于实现。当希望能够立即发送和接收数据,且处理的套接字数量比较少的情况下,使用阻塞模式来开发网络程序比较合适。阻塞模式套接字的不足表现为:在大量建立好的套接字线程之间进行通信比较困难,在同时处理大量套接字时,将无从下手,扩展性差。3.5.1 非阻塞模式 套接字的非阻塞模式是指套接字在执行操作时,调用的函数不管操作是否完成都会立即返回的工作模式。非阻塞套接字在处理同时建立的多个连接,发送和接收数据量不均、时间不定等方面具有明显的优势。非阻塞模式:即通知系统内核,在调用Windows Sokets API时,不要让线程睡眠,而应该让函数立刻返回。在返回时,该函数返回一个错误代码。一个阻塞模式套接字多次调用recv()函数的过程如下图所示: 系统调用 WSAEWOULDBLOCK 系统调用 WSAEWOULDBLOCK 系统调用 WSAEWOULDBLOCK 系统调用 返回成功指示应用进程Recv()Recv()Recv()Recv()处理数据报内核无数据准备好无数据准备好无数据准备好数据准备好复制数据复制完成 图1.5 非阻塞模型前3次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。第4次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。非阻塞模式套接字与阻塞模式套接字相比,使用较复杂。使用非阻塞模式套接字,需要编写更多的代码,以便在每个Windows Sockets API函数调用中,对收到的WSAEWOULDBLOCK错误进行处理。因此,非阻塞套接字显得难于使用。非阻塞模式的优势在于:管理多个连接,在数据收发不均、时间不定等方面明显具有优势。3.6 套接字I/O模型Windows 是非抢占式多任务操作系统,也就是说应用程序如果不放弃控制权,其它的程序无法执行。在Berkeley Sockets网络程序设计中,默认的操作是阻塞操作;而在Windows Sockets网络程序设计中,虽然集成了阻塞操作,但却不提倡使用阻塞操作。Windows Sokcets由于支持消息驱动机制,对网络事件采用了基于消息的异步存取策略,从而应用程序开发者能够更方便地处理网络通信。Windows 套接字I/O模型包括: select模型、WSAAsyncSelect模型、WSAEventSelect模型、overlapped模型与CompletionPort模型。Select模型: 是一种比较常用的I/O模型。利用该模型使得Windows Sockets应用程序可以在同一时间内管理和控制多个套接字。该模型的核心是select()函数。在使用该函数时,还需要用到FD_SET、FD_ZERO、FD_ISSERT、FD_CLR宏。 FD_SET: 将套接字加入集合中#define FD_SET(fd,set) doIf(fd_set FAR *)(set)-fd_count fd_array(fd_set FAR *)(set)-fd_count+= (fd);while(0); FD_ZERO: 将集合初始化为空集合#define FD_ZERO(set) (fd_set FAR*)(set)-fd_count=0 FD_ISSERT: 检查套接字是否是集合的一名成员,如果是,则返回TRUE;#define FD_ISSERT(fd,set) _WSAFDIsSet(SOCKET)(fd),(fd_set FAR *)(set) FD_CLR: 将套接字从集合中删除 #define FD_CLR(fd,set) doU_int _i; For(_i =0; _i fd_count;_i+)If(fd_set FAR*)(set)-fd_arry_i = fd)While(_i fd_array_i=(fd_set FAR*)(set)-fd_arry_i+1;_i+;(fd_set FAR*)(set)-fd_count-;Break;while(0)套接字的select模型能够使Windows Sockets应用程序同时对多个套接字进行管理,调用select()函数检查当前各个套接字的当前状态。并且根据该函数的返回值,判断套接字的可读可写性,然后调用响应的Windows Sockets API,完成数据的发送、接收等。WSAAsyncSelect模型:是Windows Sockets的一个异步I/O模型。利用该模型应用程序可以在一个套接字上,接收以Windows消息为基础的网络事件,Windows Sockets应用程序在创建套接字后,调用WSAAsyncSelect函数注册感兴趣的网络事件,当该事件发生时Windows窗口收到消息,然后应用程序就可以对收到的网络事件进行处理。WSAEventSelect模型:是Windows Sockets提供的另外一个有用异步I/O模型,该模型允许一个或多个套接字上接收以事件为基础的网络事件通知。Windows Sockets应用程序在创建套接字后,调用WSAEventSelect()函数,将一个事件对象与网络事件集合关联在一起,当网络事件发生时,应用程序以事件的形式接收网络事件通知。overlapped模型:应用程序能在一个重叠结构上一次投递一个或者多个I/O请求,当系统完成I/O操作后通知应用程序。该模型以WIN32重叠I/0机制为基础,在应用程序调用输入或者输出函数后,立即返回。当I/O操作完成后,系统通知应用程序。利用该模型,应用程序在调用输入输出函数后,只需要等待I/O操作完成的通知即可。CompletionPort模型:完成端口是WIN32一种核心对象,利用完成端口模型,套接字应用程序能够管理数百个甚至上千个套接字。应用程序创建一个WIN32完成端口对象,通过制定一定数量的服务线程,为已完成的重叠I/0操作提供服务。当应用程序调用输入输出函数时,输入输出函数立即返回,线程继续运行。当系统接收数据完成后,向完成端口发送通知包。应用程序在发起接收数据操作后,在完成端口上等待操作结果,当接收到I/0操作完成的通知后,应用程序对数据进行处理。3.7 多线程编程由于Win32API中支持新的抢占式多任务和多线程编程,所有Microsoft Windows应用程序的编程有了很大的变化,使用Windows操作系统时能同时运行多个应用程序,这种处理能力称为多任务处理,应用程序可以创建若干可以同时运行的线程。一个线程是应用程序中的一个执行路径,在多线程程序中,每一个线程有它自己的堆栈,可以在与应用程序中运行的其他线程相对独立地工作。在Windows中提供了两中线程:用户界面线程(UI thread)和工作者线程(work thread)。一个用户界面线程由于有窗口,所以有自己的消息循环;而工作者线程由于没有窗口,所以不需要处理消息。多线程就是:主线程在运行过程中还可以创建新的线程。在同一进程中运行不同线程的好处就是这些线程可以共享进程的资源。4系统需求分析与设计4.1 套接字I/0模型选择 WSAEventSelect模型以事件形式通知应用程序,可以应用在一个非窗口的Windows Sockets程序中,实现对多个套接字的管理。WSAEventSelect模型是非阻塞的。Windows Sockets应用程序在调用recv()函数接收数据之前,调用WSAEventSelect函数为套接字注册网络事件,该函数立即返回,线程继续运行。当系统中数据准备好时,向应用程序以事件的形式发送通知。应用程序接收到这个事件后,调用recv()函数接收数据。如下图所示:应用进程WSAEventSelect()线程继续运行Recv()复制数据期间阻塞处理数据内核等待数据数据准备好复制数据将数据复制到用户空间完成复制 系统调用 返回 事件 系统调用 返回成功指示 图1.6 WSAEventSelect模型 WSAEventSelect()函数Int WSAEventSelect(SOCKET S,WSAEVENT hEventObject,Long lNetworkEvents);S:套接字hEventObject:事件对象句柄lNetworkEvents:应用程序感兴趣的网络事件集合 WSAEVENT WSACreateEvent(void)创建一个事件对象。 BOOL WSACloseEvent(WSAEVENT hEvent);应用程序完成对网络事件处理后,需要调用WSACloseEvent()函数,释放事件对象占有的系统资源。4.2 客户端和服务器端分析系统分为客户端和服务器端,服务器端负责对客户端进行管理,向客户端发送用户列表,主要实现以下功能: 维护所有用户信息。该服务器最多能容纳64个成员,成员信息包括:用户名称、IP地址、端口和状态。当服务器退出时,不保存用户信息。 通知客户端更新成员列表。当用户加入或者退出,服务器向所有用户发送成员列表。 通知客户端更新成员状态。当用户开始游戏或者游戏结束时,服务器通知其他用户更新该用户状态。客户端负责游戏功能,其功能包括以下几个方面: 登录服务器,请求用户列表。 向其他用户发出邀请,玩游戏。 更新用户列表。当用户加入或者离开时,客户端接收服务器发送的成员列表。 更新成员状态。当用户开始游戏或者游戏结束时,服务器通知客户端用户更新该用户状态。客户端接收到该消息后,更新该用户状态。如下图所示: 游戏 更新成员 列表 请 成员 求 列表clientclientclientserverclient 图1.6 五子棋游戏 客户端启动时登录服务器。服务器接受该用户并通知其他用户。当用户退出时,服务器通知其他用户,更新用户列表。用户从服务器发送的用户列表中,选择用户,并向该用户发出游戏邀请。如果该用户同意,则开始游戏。当用户开始游戏或者游戏结束时,服务器通知所有成员更新该用户状态。4.3 数据包设计4.3.1 服务器发送包头设计 服务器向客户端发送数据之前先发送包头。包头由包类型和数据长度两个字段组成。数据包类型有用户列表和消息两种。数据长度字段说明服务器将要发送给客户端的长度。下图为数据包头格式:包类型数据长度 图1.7 服务器发送数据包头设计其中数据包类型占2字节,数据长度占2字节,共计4字节。服务器想客户端发送包头之后发送用户列表。服务器按照下图所示的数据格式向客户端发送用户列表。用户列表中包含所有用户的信息。用户信息包括:名称、状态、IP地址和端口。用户信息中每个字段之间使用|符号分割。用户信息之间使用符号分隔。客户端按照此格式解析用户列表。 用户信息 图1.8 用户格式列表4.3.2 客户端之间发送数据包设计客户端之间发送数据包由游戏状态、棋子水平位置和棋子垂直位置3个字段组成,客户端数据包格式如下图所示:游戏状态水平位置垂直位置 图1.9 客户端数据包格式其中游戏状态占 4个字节,水平位置占2个字节,垂直位置占2个字节,共计8个字节。游戏状态分别为用户请求或者应答和游戏胜负状态。胜负状态包括:对方胜、对方负、平局、我方暂时胜和不分胜负状态。其中我方暂时获胜是指先下棋方处于五子连珠状态,等待对方的最后一步。如果对方走完一步后,也处于五子连珠状态,则为平局。如果对方棋子没有处于五子连珠状态,则对方失败。用户之间的请求与应答包括下面3种情况: 开始游戏时,用户向对方发出邀请,此时对方应答的类型有接受邀请和拒绝邀请。 在游戏中,双方都可以发出认输请求或者退出游戏。 游戏结束后,双方都可以发出新开一局的请求。对方应答接受该请求或者拒绝该请求。4.4服务器端设计 服务器端采用WSAEventSelect模型开发,服务器端主要为客户端维护成员列表和通知客户端更新用户信息。4.4.1 多线程设计 线程启动后,创建服务线程。当发生网络事件时,服务线程给主线程发送消息。由主线程负责处理各种发生的网络事件。当服务退出时,主线程发送事件通知服务线程退出。在服务线程退出后,主线程退出。 服务线程主要任务是利用WSAEventSelect模型对服务器套接字进行管理。当发生网络事件时,服务线程向主线程发送消息。如下图所示: 创建 发生网络事件 结束 退出服务线程主线程 图 2.0 服务器多线程设计主线程负责处理所有的网络事件,其主要任务如下: 初始化界面、更新界面和接收用户界面操作 接受客户端的连接请求。 接受客户端数据并向客户端发送成员列表。 服务器退出时,释放资源。4.4.2界面设计1. 地址界面服务器启动后。用户需要在IP编辑框输入服务器IP地址,在PORT编辑框内输入服务器端口。 图 2.1 地址界面 2. 主界面 用户输入服务器IP地址和端口后,单击LOGIN按钮,显示服务器主界面如下图所示 图2.2 服务器主界面单击【启动服务器】按钮,启动服务器。服务器启动后该按钮处于无效状态。服务器界面显示所有用户信息。用户信息包括:名称、状态、IP地址和端口。图中 表示该用户处于游戏状态,表示该用户处于等待游戏状态。单击【退出服务器】按钮,服务器退出。4.5客户端设计网络五子棋游戏程序中,客户端主要实现游戏功能。4.5.1 多线程设计主线程启动后创建工作线程。当发生网络事件时,工作线程给主线程发送消息,由主线程负责处理各种发生的网络事件。当客户端退出时,主线程发送事件通知工作线程退出。在工作者线程退出后,主线程退出。基本流程如下图所示: 创建 发生网络事件 结束 退出 工作线程主线程 图2.2 客户端多线程设计工作者线程的主要任务是利用WSAEventSelect模型对客户端套接字进行管理。当发生网络事件时,工作线程向主线程发送消息。主线程负责处理所有的网络事件,其主要任务如下所示: 初始化界面、更新界面和接收用户界面操作。 登录服务器。 接受其他用户的连接请求,或者向其他用户发出邀请。 与其他用户数据通信,做游戏。 接收服务器数据,更新用户列表。 客户端退出时,释放资源。4.5.2 界面设计 客户端界面设计包括登录界面、主界面、用户列表和菜单设计。1. 登录界面 客户端登录服务器界面如图2.3所示,用户需要在地址编辑框输入服务器IP地址,在端口号编辑框输入服务器端口号,在用户名编辑框内输入用户名称。 图2.3 客户端登录界面 2. 主界面用户成功登录服务器后,客户端显示图2.4所示界面,客户端主界面分为左右两个窗口。左边为五子棋棋盘,右边窗口显示用户列表。图中握手表示该用户处于游戏状态,茶杯图标表示该用户处于等待游戏状态。图2.4 客户端主界面3. 用户列表 当用户希望与其他用户下棋时,双击该用户名称,向对方发出邀请。如果对方接受邀请,则开始下棋。 图2.5 用户列表4. 菜单设计程序提供开局、投降、退出游戏、退出程序等基本功能 图2.6 菜单界面5系统具体实现5.1 服务器端实现 5.1.1 静态类图 网络五子棋游戏服务器端程序是基于对话框的MFC应用程序,其静态类图如图2.7所示。 图2.7服务器端静态类图该程序主要包括:CServerDlg类、CServerApp类、CServerAddrDlg类、CClientSocket类、CUserInfo类和CAboutDlg类。 CServerDlg类: 实现服务器的主要功能。 CServerAddrDlg类:保存服务器地址和端口。 CClientSocket类: 实现与客户端通讯。 CUserInfo类: 描述用户信息。 CServerApp类:创建应用程序实例。1. CServerDlg类CServerDlg类实现服务器主要功能。OnInitDialog()函数用于初始化服务器,主要包括对套接字和列表视图控件的初始化。OnStartService()函数启动服务器,开始监听客户端的连接请求,OnStopService()函数用于服务器退出。ServiceThread()函数是服务线程函数,该函数利用WSAEventSelect模型实现对服务器套接字的管理,在CServerDlg类定义了OnSocketAccept()、OnSocketRead()和OnSocketClose()3个消息响应函数,分别用于对FD_ACCEPT、FD_READ和FD_CLOSE网络事件进行响应。 CServerDlg类成员函数如表1.1所示: 函数名称返回值功能OnInitDialog()BOOL初始化对话框OnStartService()Void启动服务器OnStopService()Void退出服务器OnSocketAccept(WPARAM wParam,LPARAM lParam)LRESULTFD_ACCEPT网络事件自定义消息OnSocketRead(WPARAM wParam,LPARAM lParam)LRESULTFD_READ网络事件自定义消息OnSocketClose(WPARAM wParam,LPARAM lParam)LRESULTFD_CLOST网络事件自定义消息Init(void)BOOL初始化UpdateUserList(const strUserInfo,CClientSocket *pClientSocket)BOOl更新用户列表UpdateListCtrl(void)Void更新服务器界面用户列表InitSocket(void)BOOL初始化套接字InitListCtrlSetting(void)Void初始化列表视图控件BeginListen(void)BOOL服务器开始监听ClearSocketAndEventFromArr(const int nIndex)Void删除客户端套接字DeleteClientNode(SOCKET s)Void从客户端列表删除节点DeleteAllClientNodes(void)Void删除所有客户端节点FindClientNode(const SOCKET s)CClientSockets从客户端链表中查找CClientSockets指针SendUserList(void)Void发送用户列表ParserUserInfo(const CString strUserInfo)CUserInfo解析用户信息MakeSendUserString(CString &strUserInfoList)Void把用户信息转换为CSting对象Ha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一活动大餐活动方案
- 六一活动帐篷活动方案
- 六一活动投球活动方案
- 六一活动游泳池活动方案
- 六一活动趣味性活动方案
- 六一独唱比赛活动方案
- 六一纹眉活动方案
- 六一节慰问活动方案
- 六一营销活动方案
- 六一采访活动方案
- 液晶弹性体在人工肌肉领域的新进展
- 中国海洋生态环境监测市场调查研究及行业投资潜力预测报告
- 2025年上半年甘肃酒泉市肃州区选调事业单位工作人员12人重点基础提升(共500题)附带答案详解
- 《新闻传播学研究方法》大一笔记(13章全)
- GB 45184-2024眼视光产品元件安全技术规范
- 中国磁阻传感器行业市场前瞻与投资战略规划分析报告
- 艺术团体演员聘用合同模板
- 光伏知识及产品培训课件
- 自来水管线更新工程 投标方案(技术方案)
- 2025年中国建筑西南勘察设计研究院有限公司招聘笔试题库含答案解析
- 2025年兖矿集团招聘笔试参考题库含答案解析
评论
0/150
提交评论