基于Bonjour和Stream局域网移动游戏通信框架的设计
2016-08-19李君锋
李君锋
摘要:本文设计并实现了一个基于Bonjour和Stream的网络游戏通信系统,实现了iPhone/iPad之间通过局域网进行发布游戏服务、手机间连接及互相通信等功能。系统采用了Foundation框架、NSStream协议和Bonjour协议进行系统的开发,解决了自定义界面、服务发现、互相通信等问题。
关键词:IOS; Bonjour;Stream;局域网通信框架
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)20-0036-02
在当代移动设备的普及下,越来越多人热衷于手机游戏,而现在多数游戏都是基于广域网的,所以开发一套玩家通过局域网进行相互交互的游戏通信框架成为可能。在局域网无线通信中,信息数据通过电磁波的传输,到达指定接收的网络计算机中,不受到任何电路的范围限制,同时在使用过程中,不仅方便快捷,而且在对无线网络操作的过程中,还具有操作简单等优点[1]。通过此框架,用户能够方便地建立移动设备之间的通信,搭建局域网游戏世界,使得用户聚焦于游戏本生而非数据如何传递。一般的通信使用Socket通信,连接时需要通过输入服务器的IP地址和端口信息才能建立连接,这在局域网游戏中是非常不方便的。本文拟开发一套基于Bonjour和Stream的游戏通信框架,让玩家能够方便创建局域网游戏,让用户也能更方便的开发局域网游戏。
1 程序架构设计
1.1 系统模块划分
系统整体可以划分为监听服务端、服务端和客户端三大部分。其中监听服务端实现了NSNetServiceBrowserDelegate协议,主要用于实现发现服务、查找服务、获取通信的数据细节等功能,其中包含的模块有,监听服务模块、管理服务模块;服务端实现的主要功能有,设置服务器、管理服务、收到连接、发送服务端消息、管理客户端,其中包含的模块有管理服务模块、消息处理模块、客户端管理模块;而客户端实现的主要功能有连接服务器、消息处理、创建客户端,其中包含的模块有消息处理模块、服务连接模块。
图1描述了监听服务端的功能分布图。其中监听服务模块通过- (void) serverDidEnableBonjour:(TCPServer *)server withName:(NSString *)string方法对网络上已发布的服务进行监听,而管理服务模块则是通过实现NSNetServiceBrowserDelegate协议的方法对服务进行管理,并且把服务添加进服务集合里,方便用户对服务的管理。
图2描述了服务端的功能分布图。其中管理服务模块中实现套接字接收新连接事件callbackSocketConnectionAcceptedCallBack,并把连接了的服务建立成客户端存进于客户端集合中,方便用户进行管理;而消息处理模块中实现了NSStreamDelegate协议的- (void)stream: handleEvent:方法,把输入流数据转换成NSData,然后再通过NSSelectorFromString转换成回调函数,方便用户在外部对不同类型的消息进行处理。
图3描述了客户端的功能分布图。服务连接模块通过Bonjour已经解析的服务器地址或服务器地址进行连接服务器,使用CFStreamCreatePairWithSocketToHost方法创建了一个到服务器的TCP/IP连接,以及一对输入输出流。然后将它们转换为等价的OC对象——NSInputStream和NSOutputStream。
1.2 技术架构
图4描述了此框架的架构。首先用户需要在自定义游戏房间界面通过单例类BonjourKit创建监听服务createBrowserInClass,并把当前类设置代理类用于有新服务时通过[BonjourKit sharedBonjourKit].pServiceBrowser.pArrServices获取服务集合更新列表,若是创建游戏房间则作为服务器端。[[BonjourKitsharedBonjourKit] createServerName:];若加入游戏房间,则作为客户端[[BonjourKit sharedBonjourKit] createClientIndex: Name:];然后在主要的游戏层里设置当前类为代理类,用于实现各类通信消息的处理。
2 核心功能设计
1)利用Bonjour建立通信。Bonjour是一种能够自动查询接入网络中的设备或应用程序的协议,也称为零配置联网,能自动发现IP网络上的电脑、设备和服务。Bonjour 使用工业标准的 IP 协议来允许设备自动发现彼此,而不需输入IP 地址或配置DNS 服务器。Bonjour 抽象掉 ip 和 port 的概念,让我们聚焦于更容易理解的 service。通过 Bonjour,一个应用程序 publish 一个网络服务 service,然后网络中的其他程序就能自动发现这个 service,从而可以向这个 service 查询其 ip 和 port,然后通过获得的 ip 和 port 建立 socket 连接进行通信[2]。通常通过 NSNetService (建立与发布 service)和 NSNetServiceBrowser (监听查询网络上的 service)来使用 Bonjour[3]。
2)实现网络消息通信封装了两个NSStream,NSInputStream用于从socket读取数据,NSOutputStream用于写入数据,因为Stream是单向的,所以每一个socket都需要建立两个NSStream。NSStreamEvent是一个流事件枚举,在-(void)stream:handleEvent: 函数使用switch语句来判别NSStreamEvent常量[4]。
3)通过Bonjour协议,创建NSNetService对象发布服务到网络中,而这时需要定义一个唯一的服务类型名,此处服务类型名设置为"_mygame._tcp."[5]。当网络中发现有服务被添加或者移除时候,NSNetServiceBrowser的委托方法会被调用,在其中进行需要的逻辑处理,并且加入到服务集合中,方便更新服务列表。
4)若玩家作为客户端,选择其中一个服务加入其中时,会向选中的服务发送resolveWithTimeout:方法验证服务是可用的和准备您的应用程序,同时设定NSNetService来回调事件;若玩家作为服务端,创建了一个服务并且被某个客户端连接时,会触发SocketConnectionAcceptedCallBack方法得到新接受连接的套接字并创建readstream和writestream,并以此创建一个Client对象并存入客户端集合中。
5)服务端或者客户端在接受NSData数据后,根据消息头调用对应的消息处理函数并把消息以键-值的词典方式传递过去,而在代理类中应实现需要的消息处理函数。
3 结论
本文介绍了如何使用Bonjour和Stream发布网络服务和互相通信。用户只需要编写好游戏间的通信类型以及处理,就能快速地进行局域网游戏的开发。并且Bonjour的使用并不局限于iPhone与iPad,通过Bonjour探测可以发布Bonjour服务的任何类型的设备。
在框架的开发过程中,利用Bonjour建立的局域网连接是相较稳定的,但网络环境错综复杂,所以这是一种相对稳定,在某些情况下仍可能导致网络的延迟。本框架只加入了有限的功能性,但已形成了基本框架。但要实现更为稳定的网络通信更复杂的功能,仍有待开发与拓展。
参考文献:
[1] 王明炯. 关于局域网无线通信系统的探讨[J].中国新技术新产品,2012(16):23-24.
[2] Lee J,Doerner R,Luderschmidt J,et al.Collaboration between tabletop and mobile device[C]//Ubiquitous Virtual Reality (ISUVR),2011 International Symposium on. IEEE,2011:29-32.
[3] Jonathan Levin. Mac OS X and iOS Internals[M].London:Wrox Press,2012.
[4] (美)Jack Cox.iOS网络高级编程:iPhone和iPad的企业应用开发[M].张龙.北京:清华大学出版社.2014:176-180,267-301.
[5] 耿建平,姚瑛.关于Bonjour技术的研究[J].国外电子测量技术,2011(4):73-75.