我有一个应用程序,我编写的日志信息通过tcpsocket发送到服务器,并让监视器客户端连接到服务器以查看日志记录数据。到目前为止,我能够进入信息发送到服务器的阶段,但我需要一些关于如何进入下一阶段的想法。使用Ruby tcpsever我可以使用哪些方法让服务器将传入的数据重新发送到客户端?如何跨线程存储数据?
require "socket"
server_socket = TCPServer.new('localhost', 2200)
loop do
# Create a new thread for each connection.
Thread.start(server_socket.accept) do |session|
# check if received is viewer request
line = session.gets
if line =~ /viewer/
@filter = line[/\:(.*?)\:/]
session.puts "Listining for #{filter}"
loop do
if (log = ### need input here from logging app ###)
# Show if filter is set for all or cli matches to filter
if @filter == ':all:' || log =~ /\:(.*?)\:/
session.puts log
end
# Read trace_viewer input.
if session.gets =~ /quit/
# close the connections
session.puts "Closing connection. Bye!"
session.close
break
end
end
end
end
end
end
答案 0 :(得分:0)
当客户端连接到服务器时,它听起来像是典型的客户端/服务器配置,有些客户端发送数据,有些客户端请求它。您是否有任何理由不使用标准HTTP客户端/服务器,即Web服务器,而不是重新发明轮子?使用Sinatra或Padrino,甚至是Rails,你将大部分完成。
如何跨线程存储数据?
Ruby的Thread模块包含Queue
,这对于在线程之间移动数据很有用。文档页面有一个应该有帮助的例子。
使用队列的相同想法将适用于使用表格。我建议使用数据库充当您使用的队列,而不是在内存中执行。断电或应用程序崩溃将丢失所有数据(如果它是内存中队列并且客户端未检索到所有内容)。编写和读取数据库意味着数据可以解决这些问题。
保持模式简单,为其提供合理的索引,并且对于大多数用途来说它应该足够快。你需要一些内务代码来保持数据库清洁,但使用SQL或者像Sequel或ActiveRecord这样的ORM很容易。