我正在用 Java 为回合制游戏编写游戏服务器。 这些是事实:
首先,我从我的选项列表中排除了 UDP,因为我需要一个可靠的协议(protocol),因为在极少数情况下我真的需要发送一些不能放在一个数据包中的数据,我不想为合并数据包和类似的问题而烦恼事情,跟踪到达包裹的顺序和其他低级的东西。
所以两难的问题是使用 TCP 还是 HTTP。
TCP 尝试 #1
从客户端到服务器(反之亦然)的连接一直处于打开状态。这样,当玩家移动时,服务器可以轻松通知游戏中的其他玩家移动了哪一步。这种方法让我感到困扰的主要问题是,始终打开多达 1000 个连接和套接字是否可取甚至可能?
TCP 尝试 #2
我想到的替代方案是,针对来自客户端的每个请求使用建立单独的连接/套接字。客户端将打开一个连接,向服务器发送一些小数据并关闭该连接。通过这种方法,我可以有一个固定大小的线程池,比如说 10,并在每个线程中分别处理客户端的请求,以便随时最多打开 10 个连接器/套接字。但是有两件事让我对这种方法感到困扰:
建立 TCP 套接字/连接的成本是多少?这是一项昂贵的操作还是仅需几毫秒(或更短时间)即可完成?
HTTP
我乐于接受任何类型的建议。
最佳答案
仅供引用:HTTP 是 TCP。即,使用 TCP 的特定协议(protocol)。 HTTP 基于 TCP,就像 TCP 基于 IP 等一样。所以实际上您的选择是在 HTTP over TCP 或自定义协议(protocol) over TCP 之间。你是对的,UDP 在这里不匹配。
如果您自己编写服务器,使用 HTTP 的许多好处就会消失。 HTTP 的主要好处是已经有高度优化的服务器可用,因此您可以将它用作简单有效的 RPC 系统。但是,如果您自己编写服务器,您不太可能达到 Apache 之类的效率,因此您不得不问为什么不选择一个更简单的协议(protocol)来使用?此外,绕过 HTTP 的只拉性质似乎是错误的方法。
考虑到这一点,我只会使用基于 TCP 的更轻量级的协议(protocol)。您可以更好地控制连接,并可以将更新通知感兴趣的客户端,而无需他们轮询更改。您还可以丢失 HTTP 请求/响应开销,这在您的情况下大多是多余的。您可以改为使用相当简单的定制协议(protocol),可能基于 XML 或 JSON,或者可能是现有的可用 RPC 方法之一。
关于java - 为回合制游戏服务器选择哪种协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354178/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我正在尝试使用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
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基