我面临以下情况:
我有几台设备(运行 ARCH Linux 的嵌入式设备),我想随时拥有对每台设备的管理权限。问题是设备位于 NAT 之后,因此无法建立从服务器到设备的连接。我怎么能做到这一点?
我想我可以编写一个在设备上运行的简单服务,该服务在启动时打开与服务器的连接。此 TCP 连接保持打开状态,可从服务器使用它来管理设备。但是长时间保持 TCP 连接打开是个好主意吗?如果我有很多设备,例如 1000 个,我在服务器端是否会遇到 1000 个打开的 TCP 连接的问题?
有没有别的办法?
非常感谢!
最佳答案
But is it a good idea to keep TCP connections open for a long time?
这不一定是个坏主意;虽然在实践中连接会不时失败(例如由于网络重新配置、临时网络中断等),因此您的客户端应该包含在发生这种情况时自动重新连接的逻辑。另请注意,当完全空闲的 TCP 连接不再具有连接时,TCP 通常不会检测到它,因此为了避免实际上未连接的“僵尸连接”,您可能需要启用 SO_KEEPALIVE,或者让您的客户端和/或者服务器在套接字上发送(非常偶然的)虚拟数据位,只是为了让 TCP 堆栈检查套接字上是否仍然存在连接。
If i have a lot of devices, for example 1000, will i have a problem on the server side with 1000 open TCP connections?
缩放绝对是您需要考虑的问题。例如,select() 通常只处理固定数量的连接(通常为 1024),或者如果您的服务器使用的是每连接线程模型,您会发现具有 1000 多个线程的进程是效率不高。查看c10k problem article有关各种方法及其扩展(或不扩展)效果的许多有趣细节。
Is there maybe another way?
如果您不需要立即访问客户端,您始终可以让他们定期 checkin (例如每 5 分钟一次);或者你可以让他们偶尔向服务器发送一个 UDP 数据包而不是一直保持 TCP 连接,只是为了让服务器知道他们的存在,并让服务器以某种方式向他们指示(例如通过更新一个众所周知的网页客户端不时检查)当它希望其中之一打开完整的 TCP 连接时。或者可能只是使用多台服务器来分担负载...
关于linux - 用于管理的永久 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24186248/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
当我使用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
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame