




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录 摘要 . 1 关键字 . 1 1 前言 . 1 1.1 程序开发背景 . 1 1.2 程序开发目标 . 1 1.3 编码设计标准与规范 . 2 1.4 程序开发的实际意义 . 2 1.5 对 “单击对战 ”的解释 . 3 2 相关软件及技术介绍 . 3 2.1 开发平台与工具选择 . 3 2.1.1 .NET 简介 . 3 2.1.2 Microsoft Visual Studio 2008 简介 . 3 2.2 相关技术简介 . 3 2.2.1 使用 UDP 协议的套接字技术 . 3 2.2.2 使用 TCP 协议的套接字技术 . 3 2.2.3 Socket 方法和相关类介绍 . 4 2.2.4 多线程的使用 . 4 2.2.5 事件的使用 . 4 2.2.6 反射调用一个类的私有成员 . 4 3 可行性分析与需求分析 . 4 3.1 可行性分析 . 4 3.2 需求分析 . 5 3.2.1 功能需求 . 5 4 单击对战游戏设计 . 5 4.1 系统设计思想 . 5 4.2 系统总体设计 . 5 5 主要功能详细设计 . 6 5.1 在线用户列表的获得 . 6 5.1.1 设计思路 . 6 5.1.2 实现过程 . 6 5.2 进入对战窗体的友好用户体验 . 9 5.2.1 设计思路 . 9 5.2.2 关键代码 . 9 5.3 五子棋对战窗体功能 . 12 5.3.1 设计思路 . 12 5.3.2 关键代码 . 12 6 系统测试 . 15 6.1 测试分析报告 . 15 6.2.1 测试方式简介 . 15 6.2 改进意见 . 15 7 结束语 . 15 致谢 . 15 参考文献 . 15 1 单击对战游戏的设计与实现 计算机科学与技术专业学生 指 导教师 摘要 : 系统 是基于 .NET 平台 开发的 一个 P2P 结构 的单击对战 五子棋 游戏。 基于 P2P、套接字、事件、设计模式、多线程、反射等 技术 , 使用 c#语言和 UDP 协议的套接字进行广播 ,不但 可以 实现 在 局域网内获得所有在线用户 IP 列表、状态 的功能 , 而且通过 使用 TCP 协议的 套接字 可以 实现 多个 用户之间 的 连接 、 游戏、聊天、 并 闪动 对方 屏幕 的功能 。 以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以广泛的使用,休闲类网络游戏集趣味性、娱乐性、互动性和益智性于一体,已经成为多数人群的休闲方式。 关键字 : P2P; UDP 广播; TCP 协议;设计模式; 事件 1 前 言 1.1 程序开发背景 随着计算机信息技术的发展,网络游戏已成为我们生活中的重要组成部分,但由于广域网游戏占用的资源较多、易受到病毒等缺点,所以局域网 游戏被游戏爱好者广泛使用。无论是对于初步探索网络编程的编程爱好者还是有志于在物联网方面发展的程序员,编写简单的局域网游戏都是一个很好开始。 网络游戏在市面上已经出现多年,许多游戏对战平台也已相继出现,例如我们熟知的浩方、 QQ 对战平台和街机游戏的 ArcadeLive 平台等等,虽说它们有很大的不同,但有一点是可以肯定的:不管是这些游戏还是对战平台,刚开始都是需要在局域网内调试的。然而,出于盈利的目的,开发商一般不会将对战平台的局域网内的版本流于市面,更不会公开自己的原代码。当然通过一些人士的分析和透露,我们知道 浩方是通过把 tcp/ip 协议转换为 ipx 协议。虚拟局域网,为大家提供了一个作战平台,但游戏开始后,玩家之间就是 p2p 的关系了,游戏速度和平台无关。但具体的实现肯定是很困难的,里面至少涉及 hook, P2P, VPN,修改数据包, java 或 C+的网络编程,进程通信,数据库的操作等等。当然一些大型游戏里面内置了网络连接模块,在局域网内是不需要再通过平台完成数据通信的。但对于一些单机游戏,要想完成局域网内的对战,对战平台就不可或缺了。这方面 ArcadeLive 是比较有代表性的,它的联网功能可能是靠 kaillera来实现的 ,要想实现联网玩游戏 ,你必须有一个 kaillera 的客户端和一个服务器端的程序 ,客户端现在大多在模拟器中自带 ,而服务器端则是一个单独的程序。总之网络联机模块的技术发展还是很成熟的,但由于开发商的保密,很多技术难题还是要自己解决的。 1.2 程序开发目标 拟开发基于 p2p 具有运用时自动加载在线用户 IP 列表、双击某个 IP 或头像自动进入五子棋游戏,并且用户体验很好的程序。 该程序无需服务器端,也就是说每个程序实例既是服务端也是客户端,也就是常被我们提及的 p2p。运行程序时通过广播特定的信息使所有在线 的用户获得自己的 IP 然后添加到自己的用户列表上,收到此特定信息的用户回复另一信息,然后就可以实现所有的人获得在线用户 IP 的功能。游戏是逐渐被世人抛弃的起源于中国古代的传统黑白棋种之一的五子棋,虽然它看似无聊,但对于练习编程技术还是很有意义的。本程序中的五子棋使用 TCP 协议的套接字进行通讯,广 2 泛应用了事件机制,接收到我们自定义的信息后就会根据以至的信息头作出相关的反映。众所周之,网络游戏会因为种种原因出现延迟,使用户持续等待甚至出现卡死的情况,本程序尽最大的努力提高用户体验的舒适性,即尽量不发生卡的情况。 1.3 编码设计标准与规范 为了在编码过程中,能够快速地、有效地阅读,我们有必要为对象约定一个规范的编码命名约定。 ( 1) . 对象命名约定 下面为在编码过程中会用到的对象统一的命名,如下表 1 所示 : 对象名 命名约定(前缀码 ) Form Frm TextBox txt PictureBox pic Panle pnl Lable lbl TextBox txt TreeView tv 表 1 对象统一的命名 ( 2) . 结构化编码约定 编码风格参照下例进行: bool startListen = false; public bool CanAgin, CanAgins, CanDown, IFirst; private Socket socketListerner; private Thread mainThread; public ClientRole clientConnectionRole = new ClientRole(); 在程序中,对一些比较难懂,或是属性不熟悉的地方加上必要的文字说明,其次,程序要有层次,使得读程序时更易读懂。 1.4 程序开发的实际意义 对于数据的通 信,我们比较熟悉的有 Tcp/Ip 协议、 UDP 协议等等。以 UDP协议为例, UDP 从应用程序接过报文后,附上目的端口号、源端口号和其他两个小字段后就直接将结果段递交给网络层。网络层将该段封装到数据报中后,尽力而为地将数据包传递给接收端主机。如果数据报到达接收端主机, UPD 将根据 IP 地址和两个端口号将段中的数据交给相应的进程。本程序中的用户列表的维护就是利用使用 UDP 协议的 Socket 发送广播进行获得。然而鉴于 UDP 协议的无连接特点,丢失数据包的可能性也很大的,所以当进入游戏窗体后,真正负责通讯的采用了 TCP 协议 的套接字进行通讯,也就是说, UDP 协议那个套接字只负责维护列表。本程序中的游戏是人气很旺的网络五子棋,选择它的原因很简单:简单直接,不会上瘾,算法简单,易于实现。 本程序的可扩展性强,程序员可以根据自己的要求将基于 TCP 的 Socket 也提到一个类中,然后通过存放到一个以远程端点为 Key 相应连接套接字为 Value的 Dictionary 中,以实现和多人对战的要求。当然也可以利用反射将游戏程序编译成一个类,然后放到一个特定文件夹下,当主窗体运行时,自动加载。除此之 3 外,对于网络编程的初学者也是很有帮助的。 1.5 对“单击对战”的 解释 本程序采用 p2p 的架构,即集服务端和客户端的功能于一体,整个设计采用事件驱动,所以非常方便实现。之所以叫做“单机对战游戏的设计与实现”,主要是内嵌的游戏是五子棋游戏,它在用户体验上的感觉基本就是单击鼠标,没有太多别的负责的操作,很是适合小朋友或是老年人玩。 2 相关软件及技术介绍 2.1 开发平台与工具选择 2.1.1 .NET简介 .NET 的编程模型将开发语言和运行时平台分离,实现了独立与语言的组件技术,通过不同的运行平台, .NET 应用可以被扩展到 PC、 PDA、手机和嵌入式设备 上。 .NET 运行平台称为 .NET Framework,是 .NET 平台的基础框架,它创造了一个完全可操控的安全的和特性丰富的应用执行环境,这不但使得应用程序的开发与发布更加简单,并且实现了众多语言的无缝连接。 2.1.2 Microsoft Visual Studio 2008 简介 为了开发 .NET 的应用,微软推出了强大的 .NET 开发工具 Visual Studio .NET(以下简称 VS)作为微软 .NET 战略的重要组成部分。 VS 包含 C#、 Visual Basic .NET、 Visual c+.NET 等 多个开发语言,同时还为第三方语言工具商提供了接口,只要支持 CLS( Common Language Specification)的语言都可以集成到 VS 环境中。 VS 充分发挥了 CLR 的潜力,为开发者提供了一个统一的集成开发环境和调试器。由于采用统一的类型定义和共享类库,各语言不仅在运行时,而且在设计就可以实现对象级 交互。 VS 不仅提供了 Web Services 开发工具,而且提供从Web Services 开发到发布、注册、整合的全过程支持。为创建和部署 Web Services, .Net 平台采用了一系列的互联网协议 ,如 XML、 SOAP、 WSDL、 UDDL等用于 Web Services 的部署、请求和响应。 软件人员最关心的还是开发效率的提高, VS 人性化的界面和众多工具将成倍提高开发效率。无论针对传统的 Windows 桌面开发, Web Services,开发人员都不必在为每种不用的应用重写全部代码,不必为不同的客户设备定制不同的界面。 2.2 相关技术简介 2.2.1 使用 UDP协议的套接字技术 数据报式 Socket( DATAGRAM)是一种无连接的 Socket,对应于无连接的 UDP 服务应用 .不安全 (丢失 ,顺序混乱 ,在接收端要分析重排及要求重发 ),但效率高。 使用 UDP 协议的套接字可以用来向许多系统支持的网络发送广播数据包。要实现这种功能,网络本身必须支持广播功能,因为系统软件并不提供对广播功能的任何模拟。广播信息将会给网络造成极重的负担,因为它们要求网络上的每台主机都为它们服务,所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接字中。广播通常是为了如下两个原因而使用的: 1. 一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址又没有任何先验的知识。 2. 一些重要的功能,例如路由要求把它们的信 息发送给所有可以找到的本网段的主机。被广播信息的目的地址取决于这一信息将在何种网络上广播。本程序中利用基于 UDP 协议的套接字向广播地址 55 发送广播的方式以获得用户列表。 2.2.2 使用 TCP协议的套接字技术 本程序中的游戏部分使用的是的 TCP 协议 4 的套接字进行通讯。众所周之流式 Socket( STREAM)是一种面向连接的 Socket,针对于面向连接的 TCP 服务应用,虽然效率低但由于其安全特性被广泛使用。某一个棋子的位置很可能关系到游戏的胜败,所以使用 TCP 协议的套接字就可以避 免丢包等问题 。 2.2.3 Socket方法和相关类介绍 -方法 - Socket (): 创建一个 Socket Bind(): 绑定一个本地的 IP 和端口号 (IPEndPoint) Listen(): 让 Socket 侦听传入的连接尝试,并指定侦听队列容量 Connect(): 初始化与另一个 Socket 的连接 Accept(): 接收连接并返回一个新的 socket Send(): 输出数据到 Socket Receive(): 从 Socket 中读取数据 Close(): 关闭 Socket (销毁连接 ) -相关类 - IPAddress 类:包含了一个 IP 地址 IPEndPoint 类:包含了一对 IP 地址和端口号 2.2.4 多线程的使用 应用多线程技术最大的误区在于没有分清适合的情况就盲目地使用多线程。除非运行一个多处理器计算机,否则在 CPU 密集的任务中使用两个线程不能节省多少时间,理解这一点很重要。在单处理器计算机上,让两个线程同时进 行 100万次运算所花的时间与让一个线程进行 200万次运算是相同的,甚至使用两个线程所用的的时间更长,因为要处理另一个线程操作系统必须用一定的事件切换线程,即分配时间片。使用线程带来的负面因素是必须额外考虑线程的并发、同步等线程安全问题,从而使得程序更加复杂而难以维护。然而,有些场合则使用多线程技术非常合适,网络应用开发就是其经常出现的场合之一。当一个线程等待从网络中获取数据,同时其他线程可以继续处理其他的任务, 此时可以节省很多时间。本程序中主要就是在针对 Accept和 Receive 这两个会阻塞的方法使用多线 程。 2.2.5 事件的使用 由于不知道什么时候会有人发送信息给自己,所以程序中应用事件来处理对方的消息,即监听对方发送的消息,如果接受到的消息和自己要处理的一致,则执行注册在其上的方法。例如, A 上线的时候,就会向广播地址发送 “Logon”消息,已经在线上的 B、 C 收到此消息后就行执行自定义的OnGetList 事件,然后此事件调用注册在自己身上的 GetListMethod 方法,从而实现将 A 的 IP 地址加到自己的用户列表上的功能。 2.2.6 反射调用一个类的私有成员 当用户进入对战窗体后,主窗体的用 户列表不可用,即一次只能和一个用户进行游戏,(这只是我个人规定)。当用户退出对战窗体后,必须要求主窗体的用户列表重新可用,但我们注意到,窗体类的TreeView 类型字段默认是 private,也就是其它类不可访问的,当然我们可以将其改成 internal 或更加访问级别使外界可以访问。但我们有更专业的手段:利用反射技术。 .NET 的一个反编译工具 Reflector 就是利用发射实现的。 3 可行性分析与需求分析 3.1 可行性分析 在很早以前五子棋软件就已经被开发出来了,当时的五子棋软件仅提供了 5 “ 人机模式 ” 与 “ 双人模 式 ” 。 “ 人机模式 ” 是指,人与计算机进行对弈,计算机按照事先编写好的算法程序来进行下棋; “ 双人模式 ” 是指,两个人通过交替使用同一台计算机来进行下棋。无论是选择哪一种模式,所有的操作都必须在同一台计算机上来往完成,棋局无法在异地计算机之间来进行,故而也叫单机版五子棋软件。 3.2 需求分析 软件的需求分析是软件生存期中重要的一步,也是决定性的一步。只有通过需求分析才能把软件功能和性能的总体概念描述为具体的软件需求规格说明,从而奠定软件开发的基础。在此阶段,了解用户要求本软件必须满足的所有功能和限制,以及用户对软 件功能和性能的要求,弄清用户想要软件 “做什么 ”,准确地表达用户的要求。 3.2.1 功能需求 ( 1) . 运行游戏自动获得所 有 在线用户列表并且自己的 IP 加到所有其他在上用户玩家列表上的功能 。 ( 2) . 显示请求对战提示框 。 ( 3) . 进入对战窗体,其他用户无法再与其游戏 。 ( 4) . 显示玩家退出提示框 。 ( 5) . 能通过网络进行下棋 。 ( 6) . 符合五子棋的基本规则 。 ( 7) . 提供玩家之间的聊天功能 。 ( 8) . 提供玩家之间闪屏功能 。 ( 9) . 一个用户退出程序,所有在线用户列表中自动清除退出用户对应的IP。 ( 10) . 用户界面需求界面友好、亲切 。 ( 11) . 界面简洁、不花哨 。 ( 12) . 操作界面直观、不繁琐 。 ( 13) . 用户体验良好 。 4 单击对战游戏设计 现有的网络编程模式主要分成两类:一种是基于 C/S(Client/Server客户机 /服务器 )模式,另一种是 B/S (Browser/Server,浏览器 /服务器 )模式; C/S 程序具有好的交互性,功能强大, 但是客户端必须安装客户端软件,服务器端也要运行,限制了其应用; B/S 模式下要求客户端具有浏览器,但浏览器在安全方面有一些限制,交互性与功能有一些限制。由于这两种模式的种种弊端,单击对战游戏采用了 p2p网络技术来设计与实现 ,网络内部使用 UDP和 TCP协议的 Socket 通过传输 层提供的服务进行通讯。 4.1 系统设计思想 主窗体运行时开启是一个基于 UDP协议的套接字用户获得所在网段所用玩家的 IP地址,双击一个 IP进入对战窗体。同时对方收到请求对战的提示框。 对战窗体通过一个 socket 监听其他用户的连接的连接,一旦有人连接连接,为该用户建立连接并启动一个特定的客户 socket,利用该连接不断从客户读取数据,双方的交互。 4.2 系统总体设计 系统流程图 : 6 图 1 系统流程图 5 主要功能详细设计 5.1 在线用户列表 的获得 5.1.1 设计思路 用户列表即在线用户的 IP地址。由于本程序使用的端口号为1817,所以一般情况下只需要知道本网段内所有运行了本程序的主机的 IP就能实现要求。选择广播是最简单且效率最高的手段,接下来考虑的就是应当使用什么协议的 Socket进行广播。因为只是获得列表是需要连接且要求效率较高, UDP显然在这里最适合。 5.1.2 实现过程 界面设计 ( 1) . 新建一个空解决方案,命名为 ”GobangDemo”,在解决方案上右击添加一个 “新建项目 ”,在出现的对话框上选择 “Windows 窗体应用程序 ”命名为“Gobang1”。 ( 2) . 将默认生成的窗体删除,添加一个 “Windows 窗体 ”并命名为 FrmMain,将此窗体的 FormBorderStyle属性设为 none。 ( 3) . 拖入一个 Panel控件,命名为 pnlWrap,将它的 Dock属性设为 Full。然后依运行程序 通过 UDP广播在线用户列表 双击 某个用户列表中IP,进入对战窗体 运行程序 通过 UDP广播在线用户列表 是否同意对战 请求 开始按钮可用 ,点击开始 进入对战窗体,点击开始按钮 点击棋盘 是否赢了 添加相应的棋子到相应的位置 显示对方赢了对话框,重新开始按钮可用 显示自己赢了对话框,重新开始按钮可用 聊天与发送闪屏 聊天与发送闪屏 7 次再拖入三个 Panle,分别命名为 pnlTop、 pnlMain、 pnlBelow,然后分别设置它们对应的 BackgroundImage的值。 ( 4) . 拖入一个 PictureBox控件,命名为 picClose,然后设置 Image属性以显示它默认的图片。拖入一个 ImageList控件,使用默认名字 imageList1,在其 Images属性中添加一个头像图片。拖入一个 ContextMenuStrip控件,使用默认命名contextMenuStrip1,然后添加 “显示主界面 ”和 “退出 ”两个子菜单。拖入一个NotifyIcon控件,使用默认命名 notifyIcon1 ,设置 Visable 属性为 true ,ContextMenuStrip属性为 contextMenuStrip1。 ( 5) . 拖入一个 TreeView控件,命名为 tvPlayer,设值 ImageList属性为 imageList1,ImageIndex属性为 0。 小结:其实要实现一个漂亮的界面并不是什么复杂的问题,只要一张很好看的图片就可以,但一个好的编程习惯那就是将所有的控件都放到 Panel 中,所以就要将图片切成三段,然后设置成对应容器的背景颜色。下面分别介绍各控件的具体作用: notifyIcon1 用于将程序图标显示系统托盘, picClose 用于最小化到系统托盘, tvPlayer 显示所有在线用户 IP, imageList1 里的图片作为用户列表中的头像, contextMenuStrip1 作为 notifyIcon1 的菜单。 关键代码 ( 1) . GetUserList 类中 发送 UDP 广播 的方法 SendToAll public void SendToAll(string state) IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse (255. 255. 255.255) , port); Byte sendBytes = Encoding.ASCII.GetBytes(state); try udpGetList.Send(sendBytes, sendBytes.Length, endPoint); ( 2) . GetUserList 类中处理信息的方法 GetList 中 接收来自局域网的信息: IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, port); while (true) Byte receiveBytes = udpGetList.Receive(ref RemoteIpEndPoint); string returnData = Encoding.ASCII.GetString(receiveBytes); /接下来判断收到的信息,然后作出相应的处理 处理 “Logon”消息: GetListEventArgs getList = new GetListEventArgs(); getList.IP = RemoteIpEndPoint.Address.ToString(); getList.Msg = returnData; OnGetList(this, getList); IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(getList.IP), port); 8 Byte sendBytes = Encoding.ASCII.GetBytes(Reply); udpGetList.Send(sendBytes, sendBytes.Length, endPoint); 处理 “Reply”消息: GetListEventArgs getList = new GetListEventArgs(); getList.IP = RemoteIpEndPoint.Address.ToString(); if (getList.IP != IPAddress.Loopback.ToString() getList.Msg = returnData; OnGetList(this, getList); ( 3) . 使用到的事件 public event EventHandler OnGetList; 其中的 GetListEventArgs 是一个继承自 EventArgs 的自定义类: public class GetListEventArgs : EventArgs public string Msg; /获得发过来的信息 public string IP; /获得对方 IP,用于显示的主界面的用 户列表上 ( 4) . 窗体类 FrmMain 的中的 TreeNode node = new TreeNode(); node.Text = e.IP; node.Tag = (object)e.IP; foreach (TreeNode n in tvPlayer.Nodes) if (n.Text = node.Text | n.Text.Contains(node.Text) return; tvPlayer.Nodes.Add(node); 小结:在 p2p 理念下,使用广播获得用户列表是目前为止我发现的最高效的实现手段 。 可以看到只需 向 广播地址发送 “Logon”信息, 在线的所有用户都会接收到此信息,然后执行相应的代码,其中最重要的就是将发送此信息的用户的 IP加到自己的 tvPlayer 中 。 图 2 主界面 9 5.2 进入对战窗体的友好用户体验 5.2.1 设计思路 IP 为 88 的用户 双击想要对战用户的 IP(假设是80),这次操作共发送两类信息: 180 收到 “Fight”消息,所有在线用户收到 “InRoom”消息 。 180 进入对战窗体,此时他的 “开始 ”按钮不可用 。 于是 180的用户将看到请求对战的窗体 ,并且 180 发送 “Thinking”广播; 所用 用户的用户列表 上 180 将添加 fighting标记, 180 将添加 thinking标记,此时这两个 用户暂时 都 不能再被别人请求对战。 如果 180 点击对战窗体的 “同意 ”则进入对战窗体,此时 180 将收到 “80 同意了你的请求 ”的提示框,点击确定,开始按钮可用;如果 180 点击拒绝, 180 将收到 “80 同意了你的请求 ”的提示框 , 180 的用户列表再次可用(利用反射访问似有成员)。 对战双方进入对战窗体后就开始了各自的服务端角色。 5.2.2关键代码 ( 1) . 双击 80 节点的操作 if(!tvPlayer.SelectedNode.Text.Contains(fighting) & !tvPlayer.SelectedNode.Text.Contains(thinking) GetWindow(); frmFight.IpTag = tvPlayer.SelectedNode.Tag.ToString(); frmFight.getUserList = this.getUserList; frmFight.frmMain = this; frmFight.SetFrmFightPicStartUnabled(); getUserList.SendToAll(InRoom); getUserList.SendToSelected(tvPlayer.SelectedNode.Tag.ToString(), Fight); tvPlayer.Enabled = false; frmFight.Show(); else MessageBox.Show(哥游戏中,请勿打扰! ); ( 2) . 80 收到 “Fight”后的操作 getUserList.SendToAll(Thinking); FrmCue frmCue = new FrmCue(); tvPlayer.Enabled = false; frmCue.frmMain = this; frmCue.Tag = e.IP; frmCue.lblIP.Text = e.IP; frmCue.getUserList = this.getUserList; frmCue.Show(); ( 3) . 所有在线用户收到 “InRoom”后的操作 foreach (TreeNode node in tvPlayer.Nodes) if (node.Text.Contains(e.IP) 10 node.Text = e.IP + fighting; ( 4) . 80 点击提示框的 “同意 ”按钮 private void lblAgree_Click(object sender, EventArgs e) IPAddress myIp = Dns.GetHostAddresses(Dns.GetHostName(); getUserList.SendToSelected(lblIP.Text.Trim(), Agree); if (frmFight = null | frmFight.IsDisposed) if (myIp0.ToString() = this.Tag.ToString() this.Close(); return; frmFight = FrmFight.GetInstance(); frmFight.Ready(); frmFight.IpTag = this.Tag.ToString(); frmFight.getUserList = this.getUserList; frmFight.frmMain = this.frmMain; /getUserList.SendToAll(); getUserList.SendToAll(InRoom); frmFight.Show(); this.Close(); ( 5) . 80 点击提示框的 “拒绝 ”按钮 private void lblIgnore_Click(object sender, EventArgs e) getUserList.SendToSelected(lblIP.Text.Trim(), Refuse); getUserList.SendToAll(Free); SetFrmMainTreeViewEnabedIsTrue(); this.Close(); ( 6) . 利用反射在 frmCue 中访问 frnMain 中的似有方法 private void SetFrmMainTreeViewEnabedIsTrue() Type typeFrmMain = frmMain.GetType(); MethodInfo methodNiDongDe = typeFrmMain. GetMethod( SetTreeViewEnableIsTrue,BindingFlags.NonPublic | BindingFlags.Instance); methodNiDongDe.Invoke(frmMain, null); 11 ( 7) . 进入对战 窗体那一刻开始各自服务端的角色 IPEndPoint ep = new IPEndPoint(IPAddress.Any, mainPort ); socketListerner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketListerner.Bind(ep); socketListerner.Listen(12); startListen = true; while (true) Socket socketServer; ClientConnection conn; try socketServer = socketListerner.Accept(); conn = new ClientConnection(socketServer); dicConnections.Add(socketServer.RemoteEndPoint.ToString(), conn); RemoteTag = socketServer.RemoteEndPoint.ToString(); catch break; dicConnectionssocketServer.RemoteEndPoint.ToString().
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆重庆广播电视集团(总台)重庆卫视招聘笔试历年参考题库附带答案详解
- 2025内蒙古通辽环保投资有限公司招聘4人笔试参考题库附带答案详解
- 湖南电气职业技术学院《职业素养与商务礼仪》2023-2024学年第二学期期末试卷
- 广东理工学院《初级会计学》2023-2024学年第二学期期末试卷
- 南京理工大学紫金学院《嵌入式基础与应用》2023-2024学年第二学期期末试卷
- 赣南卫生健康职业学院《新闻报道框架研究》2023-2024学年第二学期期末试卷
- 黔东南民族职业技术学院《建筑工程施工组织管理》2023-2024学年第二学期期末试卷
- 黑龙江建筑职业技术学院《语文基础与前沿问题》2023-2024学年第二学期期末试卷
- 黑龙江幼儿师范高等专科学校《教师伦理学》2023-2024学年第二学期期末试卷
- 广西生态工程职业技术学院《摄影摄像》2023-2024学年第二学期期末试卷
- 一年级下册口算题卡大全(口算练习题50套直接打印版)
- 村级固定资产管理制度
- 日照实验高中国际版入学试卷
- 八年级下册《唐诗三首》中考复习素材之古诗文理解性默写背诵与强化训练
- 九年级初三中考物理综合复习测试卷3套(含答案)
- 2024年4月自考00152组织行为学试题及答案含解析
- 抗高血压药-英文版
- 24春国家开放大学《公务员制度讲座》形成性考核1-4参考答案
- 走近核科学技术智慧树知到期末考试答案章节答案2024年兰州大学
- UPS蓄电池安装施工方案(完整版无需过多修改)
- 污水管网工程项目方案资料目录清单及其表格
评论
0/150
提交评论