嗨,我在 Java中编写了一个多玩家游戏,我想知道我需要学习什么和/或我应该使用什么来使游戏可以通过网络或互联网上的多台计算机播放.谢谢,我真的很无知,因为在哪里开始,所以任何建议都是有帮助的.

解决方法

那些其他答案都是相当高的水平,这是很好的,但你不想要高级别,你想要低级别,如“我如何使它实际发送数据,这是什么意思和什么发送等“这是你做的:

一,TCP或UDP?如果你不知道这些东西是什么,请阅读它们,因为我没有空间在这里给出一个很好的破坏,但是你的选择知道如下:
TCP对于基于回合的游戏或游戏来说是好的,因为高延迟通常是可以的,因为TCP保证数据包传送,所以可能需要一些时间才能重新发送丢弃的数据包.这对于像国际象棋这样的事情或其他任何事情都是有益的.

> UDP对于你不一定关心消息可靠性的游戏是有好处的,并且更喜欢数据只是继续发送,如果你错过了一些东西,哦.这对于基于实时操作的游戏(例如HALO:Reach或使命召唤)来说是有益的.在这些中,如果发送对象的位置,并且对象永远不会在那里,最好发送一个新的位置,而不是重新发送一个旧位置(现在更老),所以一直保证可靠性并不重要.也就是说,你必须有一定的可靠性,所以你仍然需要某些事情来保证交付,如对象创建和对象销毁.这意味着您需要在UDP之上实现自己的半可靠,基于优先级的协议.这是困难的.

所以,问自己什么是重要的,了解TCP和UDP如何工作,然后做出明智的选择.

也就是说,现在您必须通过网络同步对象状态.这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的内容.写入插座很容易;如果你可以写一个文件,你可以写一个套接字,这真的不难.重要的是确保您能够将对象表示为缓冲区,因此如果对象具有对其他对象的引用/指针,那么您将无法发送这些指针,因为它们在其他客户端上不同,所以你必须将它们转换成所有主机通用的东西.这意味着ID,尽管对象的ID在所有主机中必须是唯一的,因此您必须有一种方法来在主机之间进行协调,以使两个主机不会创建具有相同ID的不同对象.有办法处理这样做的主机,但我们不用担心这个(提示:使用主机的ID和网络ID之间的某种映射.更大的提示:不要这样做,如果你不需要).

那么现在你可以发送数据,好了,现在呢?每当游戏状态发生变化时,您必须以其他方式向其他机器发送更新.这是客户端 – 服务器体系结构所在的地方,如果需要,也可以是对等的.客户端 – 服务器更容易实现.此外,一个主机“代理”作为服务器仍然是客户端 – 服务器,任何说不同的人是错误的.

所以,服务器的责任是“拥有”所有的游戏状态.只有服务器可以肯定地说出一个对象的状态.如果你想移动一个对象,你告诉服务器你想移动,然而服务器然后告诉你你应该移动对象,你不只是做(虽然某种客户端预测通常是有用的).因此,服务器将更新的对象状态发送到所有其他主机.

所以,你提到了一个回合制的游戏吧?很简单:

>您将要彻底解决目前转向的客户端.一旦该客户端执行了他们想做的事情,将该转发的结果发送到服务器.然后,服务器验证客户端的移动(不要仅仅信任客户端,以这种方式发生作弊),并将它们应用到其对象状态.
>一旦服务器是最新的,它将向世界上新的状态的其他客户端发送消息,并且这些客户端应用这些更新.这包括刚刚轮到的客户;该客户端只应在服务器通知时更新其世界状态,因为您希望确保与其他主机的一致性,并且您希望防止主机作弊.
>然后,服务器发出一条消息,指示它是谁的转弯.您可以在上一步中的世界状态更新的同时发送,这将是正常的.只要知道客户尝试不合时宜.这就是为什么服务器对世界有权威的原因;如果客户端尝试欺骗,服务器可能会把它们打倒.

这就是你需要做的一个回合制游戏.提示:使用TCP
更大的提示:TCP实现了一种名为“Nagle’s Algorithm”的工具,它将您的消息组合成一个数据包.这意味着如果您发送两个单独的消息与两个单独的“发送”调用,其他主机可能只接收一个数据包单一呼叫“接收”,但该数据包将包含BOTH的内容发送的数据包.因此,如果您发送两个100字节数据包,并发送两个呼叫,则可以在单个呼叫中收到一个200字节的数据包.这是正常的,所以你需要能够处理这个不知何故.一个诀窍是使每个单个数据包的大小相同,然后在每次检查输入时只从套接字读取多个字节.请记住,您也可以获得部分消息.例如,如果发送两个100字节的消息,它们可以组合成一个200字节的消息.接下来,如果从另一端的套接字读取,但是您读取的缓冲区大小为150字节,则将有150个字节,其中包含第一个数据包,第二个数据包的一部分.您必须再次拨打电话才能获得第二条消息的其余部分,因此请保持跟踪您收到的数据量,以免丢失某个数据包的某个部分.这就是为什么保持你的数据包相同的大小是有用的.

还有一些其他有用的技巧可以减少您的邮件的大小和频率,并跟踪不是基于回合的游戏,并且实时执行,但是如果您有一个基于回合制的游戏,那么正确的事情做大概是使用TCP,而不用担心任何其他的东西.这里有一些链接到有用的网站和文章,将为您提供有关如何完成游戏网络编程的更多信息:
http://www.gafferongames.com/ Glenn Fiedler的网站,这里有一些很好的信息.
1500 archers关于如何实现一个称为确定性锁步的技术的伟大论文,这对许多类型的游戏是有用的.

让我知道,如果你想要更多的细节,任何这些东西,或者如果你有更多的具体问题.

java – 通过网络或互联网制作多玩家游戏的更多相关文章

  1. html5 http的轮询和Websocket原理

    这篇文章主要介绍了html5 http的轮询和Websocket原理的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. ios – Objective-C中的Google用户serverAuthCode nil

    我正在尝试将GoogleSignIn框架集成到iOS应用程序中,并对服务器上的用户进行身份验证.我设法登录用户,但在–(void)signIn:(GIDSignIn*)signIndidSignInForUser:(GIDGoogleUser*)用户withError:(NSError*)错误委托方法,user.serverAuthCode为nil,我需要通过此服务器身份验证代码,嗯,验证服务器上

  4. ios – CloudKit – 如何保存记录如果不存在

    我正在尝试创建一个包含唯一值的记录类型,并将作为另一个记录类型的目标引用对象.例如,录制类型–电影将包含用户提交的唯一电影列表.而且FavoriteMovies将包含用户参考和电影参考.用户可以从现有电影列表中进行选择,也可以向其中添加新电影.如果我创建一个新的电影记录,而另一个用户创建一个具有相同名称的新记录(在我检索电影列表之后,但在我尝试添加新电影之前),则会出现问题.这两个新记录被认为是具

  5. Swift开发:GCDAsyncSocket通信之TCP服务器

    overridefuncviewDidLoad(){super.viewDidLoad()clientSockets=NSMutableArray()msgTextView.backgroundColor=UIColor.grayColor()msgTextView.text="接收的客户端消息:\n"}//发送消息按钮@IBActionfuncsendBtnClick{ifclientSockets.count==0{return}letmsg=inputTextInput.text!//1.处理请求,

  6. 让你真正明白cinder与swift、glance的区别

    Cinder——提供块存储,类似于Amazon的EBS块存储服务,目前仅给虚机挂载使用。Cinder包含以下三个主要组成部分APIservice:Cinder-api是主要服务接口,负责接受和处理外界的API请求,并将请求放入RabbitMQ队列,交由后端执行。Cinder目前提供VolumeAPIV2Schedulerservice:处理任务队列的任务,并根据预定策略选择合适的VolumeService节点来执行任务。目前版本的cinder仅仅提供了一个SimpleScheduler,该调度器选择卷数量

  7. swift – 如何编码非托管到base64以发送到另一台服务器?

    我正在尝试使用密钥对加密来验证我的应用程序和我的PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.publicKey的类型为Unmanaged.我在上面的代码中得到的错误是:调用中的额外参数’base64EncodedData’我该怎么办?有没有更好的办法?编辑:这是密钥对的生成方式:编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?您似乎可以将密钥临时存储到钥匙串,然后将其恢复并将其转换为数据:

  8. 如何在android中设置多个SMTP服务器?

    我的问题是如何设置多个SMTP服务器在Android中发送邮件,如:雅虎,hotmail,gmail,rediff任何类型的域名将在发送邮件时起作用.任何人都可以建议任何网站或任何想法吗?请帮帮我,谢谢你.解决方法以下是GMail,Yahoo!的测试设置.和Hotmail.使用适用于Android的JavaxMail端口进行测试.

  9. 如何将android客户端连接到我的笔记本电脑内的Apache服务器(php)的localhost?

    我的笔记本电脑中的localhost-127.0.0.1或android10.0.0.1中的localhost?>那么,如果我想从android访问localhost来调用PHP来运行?哪个ip地址/url我需要放在Android应用程序?我需要在httpconfig中为XAMPP修改任何内容吗?解决方法使用ipconfig在笔记本电脑中找到您的IP地址.在手机中使用该地址而不是127.0.0.1.

  10. 如何在Android服务器上发布大型视频?

    我想发布一个大视频.我正在使用FTP将视频发送到服务器,但上传会在一段时间后停止.在服务器上视频崩溃,但我可以上传较小的视频.我还使用HTTP将视频发送到服务器,作为Base64编码字符串发送,但编码时出现内存不足异常.我试图将视频上传为文件,但没有成功.将大型视频上传到服务器的最佳方法是什么?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部