草庐IT

java - 安卓多人网络游戏

coder 2023-11-27 原文

我正在编写一个 Android 多人游戏,它基本上由客户端连接和交换消息的服务器组成。当玩家连接到服务器时,玩家列表会返回给他/她。然后玩家可以选择一个用户来挑战——当然他必须从玩家列表中选择一个玩家,该列表只包含连接的用户。

当玩家 1 挑战玩家 2 时,需要从玩家 1 向服务器发送一条消息,服务器又必须向玩家 2 发送消息,通知他挑战。然后玩家 2 可以接受/拒绝挑战。

我可以使用以下技术来实现这一点:

  • 将自定义服务器/客户端与 Java 套接字编程结合使用。服务器基本上接受来自客户端的连接,为每个连接的客户端生成一个新线程。这样做的问题是:
  • 需要从客户端到服务器打开一个持久连接,这会浪费 Android 手机的电池生命周期。这并不是很大的限制,因为电池没有消耗那么多。
  • 当我想开发另一个游戏时,我必须从头开始重写客户端/服务器代码——还要选择另一个端口来监听传入的连接——整个概念变得相当难以维护。
  • 我也担心这是不是这样做的方式。如果数千个客户端同时连接,则为每个客户端生成另一个线程听起来相当多。但我猜PC游戏就是这样做的。不确定安卓。
  • 使用 Java REST jersey 在 HTTP 之上构建客户端-服务器。如果服务器可以轻松地向客户端发送通知,这将是一个完美的解决方案。这里实际上有多个设计决策:
  • 客户端每隔几秒就为任何新数据/通知拉取服务器 - 这真的很糟糕,因为我们陷入了无响应、延迟等问题。
  • 客户端可以向服务器发送等待请求,因此客户端只有在一些数据可用后才会收到响应。这更好,但是当需要一个接一个地向用户发送两个通知时,仍然会产生延迟。第一个通知会立即发送,因为客户端已经打开了连接,等待接收数据。但是我们必须等待客户端发起另一个长 http 请求才能接收第二个通知。由于需要连续向特定客户端发送多个通知,因此问题变得更大。
  • 客户端可以启动 http 流,在处理请求时通信保持打开状态,因此服务器也可以随时向客户端发送多条消息。这里的问题是我不知道这在 Android 上的效果如何。我看过几个实现:
  • Java jersey + 氛围:没有真正让它发挥作用。这似乎是最有希望的,但我不想在它上面花太多时间,因为我什至不确定它是否符合我的要求。
  • Deacon:看起来很整洁,但是在他们官方网页上看到视频教程后,我不确定它是否可以满足我的需求。当玩家 1 挑战玩家 2 时,它是否可以向玩家 2 发送通知,让它知道比赛请求?
  • 如果两个玩家通过网络玩游戏,我很高兴知道其他多人游戏如何处理网络通信。
  • 我也对如何实现我想要的全新建议持开放态度。我几乎可以编写任何代码,所以不要犹豫,让我知道一些更困难的实现网络通信的方法。

  • 我还要提一下,我很乐意在我的情况下实现一种完全特定的方法,所以它可以是任何可以完成工作的东西,但我也在寻找更通用的客户端和服务器之间的通信方式.这样我就可以对界面/任何东西进行编程,并在其他 android 游戏、android 应用程序中重用代码。

    我希望我能很好地提出问题,并且我会收到一些有值(value)的答案。

    谢谢

    最佳答案

    你应该看看XMPP。它是一种协议(protocol)(最初为聊天程序创建),允许在用户之间发送 xml 数据。
    它具有独立的客户端-服务器关系,因此您可以专注于开发适合手机的客户端应用程序,并根据您的需要开发不同的服务器。

    有大量关于该协议(protocol)的信息(我应该知道,我写了一篇关于在游戏应用程序中使用该协议(protocol)的论文),但您可以从 looking it up on wikipedia 开始。看看它是否是你想要的。

    aSmack是一个用于创建 android xmpp-clients 的库。设置它并让一切正常工作需要一些调整,但是一旦你这样做了,它就很整洁。

    编辑:与建议使用 C2DM 的答案有关:
    来自 c2dm docs "Sending large numbers of C2DM messages" :

    Are you sending C2DM messages too frequently? If you need to communicate with your application frequently over a short period of time, C2DM is probably not the best solution. Instead, consider implemeting XMPP or your own protocol to exchange messages, and use C2DM only to send the initial notification.

    关于java - 安卓多人网络游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490574/

    有关java - 安卓多人网络游戏的更多相关文章

    1. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    2. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

      我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

    3. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    4. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

      这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

    7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

      HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

    8. 网络编程套接字 - 2

      网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

    9. 【Java入门】使用Java实现文件夹的遍历 - 2

      遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

    10. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    随机推荐