我是网络开发新手,只想了解一些性能比较。
我正在网络上构建俄罗斯方 block 对战游戏。大多数游戏逻辑都在用 C++ 构建的服务器内部。对于客户,我打算使用 cocos2d-js,它基本上是 javascript。
玩家的行为会影响对手。首先,用户的输入需要正确地到达服务器,服务器将输入应用到逻辑中,并将新的游戏状态发送回客户端。客户端只需要在屏幕上表示 Sprite 。
我最初的计划是用 TCP 套接字实现它,因为它可能需要低延迟。但是,我刚刚意识到我们不在网络上使用 TCP 套接字。
这种应用使用HTTP连接可行吗? 我应该尝试网络套接字吗? 有什么优点和缺点?
最佳答案
您当然可以为此使用 HTTP,但对于实时通信,最好的选择是使用 websockets。
原始套接字(也称为 TCP 套接字)不是 W3C 标准的一部分。 即使某些浏览器有 implemented它们,我建议避免使用它们,除非您不关心使用特定浏览器锁定您的应用程序。
通常,使用 Websockets 将是您的最佳选择,它们提供与原始套接字相同的性能,并且更易于从 JS 使用。 不幸的是,使用 C++ 服务器可能会更复杂,因为您的服务器必须实现该协议(protocol),您可以在互联网上找到一些实现,例如 this。例如,一个。
或者,如果您想与客户端/服务器进行更简单的集成,您可以尝试使用 Node.js 来实现您的服务器逻辑并使用 Socket.io处理通信的库,它也将优雅地处理不兼容的浏览器。请注意,Socket.io 使用不同的 protocol ,所以如果您想避免做很多额外的工作,我不建议您尝试将它与您当前的 C++ 服务器一起使用。
总结一下
我个人的建议是尽可能避免使用 TCP 套接字并遵守标准。
编辑:显然,TCP 套接字 might最终成为 W3C 标准,API 仍然是草案(而且是最近的一个),所以我仍然建议不要使用它们(最新的 Chrome 有一个实验性实现)。
关于javascript - 用于低延迟网页游戏的 HTTP 或 Websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402494/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara
我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述