我在这里陷入了一个非常困惑的境地,因此,我将解释整个场景。
我开发了一个 UDP 服务器/多客户端应用程序。
服务器有一个主接收线程。每个想要与服务器通信的客户端首先向服务器发送一个带有一些 ID 的消息。服务器从客户端接收此消息。服务器有一个包含授权 ID 列表的文本文件。当从客户端收到消息时,服务器将从客户端收到的 ID 与其文本文件中可用的 ID 进行比较。如果客户端的 ID 与服务器文本文件中的任何 ID 相匹配,则该客户端被视为已通过身份验证,并为该客户端创建一个新线程和一个新套接字。这个新客户的信息也在包含所有事件客户信息的队列中更新。
所有这些任务现在已经完成 现在的问题是,由于每个客户端都有一个专门的线程为其服务,我希望这些线程向各自的客户端发送一些消息并等待客户端的响应,如果没有响应在特定时间内从客户端接收到,客户端被认为已死亡,并从主接收线程的队列中删除。
但问题是“所有”x 个客户端将如何告诉主接收线程他们各自的客户端处于非事件状态?如果这部分做完了,主Receiving Thread是不是要遍历整个Queue,找出死掉的client的信息,然后怎么删除呢?这对我来说真是令人困惑。
已经这么久了,但我无法在我的应用程序中保留活跃客户的记录。
请尽快帮助我。提前致谢:)
编辑: 另一个想法可能是队列有 x 个元素和每个客户端的状态。例如:最初为 x 个客户:
Client# Status
1 0
2 0
3 0
. .
. .
. .
. .
x 0
每当新客户端变为事件状态时,状态就会从 0 更改为 1,而每当客户端关闭时,状态就会从 1 变回 0。
这似乎是正确的做法吗?
最佳答案
我最好建议你使用 Tcp 。使用 UDP 你必须自己做事。
I want these threads to send some message to their respective clients and wait for response from the client
首先:使队列或列表线程安全
传递列表的 ID(索引),您在其中存储有关客户端地址(客户端 sockaddr)和其他信息(如状态)的信息。在线程内部并使用索引获取有关客户端的信息。获取客户端地址,您可以向其发送消息。
If this part is done, will the main Receiving Thread have to traverse the whole Queue, find out the client's information which is dead and then how will this be deleted? this is really confusing situation for me.
您将遍历列表并获取客户端索引并更改状态。在客户端线程中,当您看到客户端状态在特定时间内未更改为事件状态时,您将从列表或队列中删除该客户端信息。
快乐的编程
关于c - 更新队列并从队列中删除所需的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017582/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和