2

我有一个应用程序,我正在编码通过 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
4

1 回答 1

0

客户端连接到服务器,这听起来像是典型的客户端/服务器配置,一些客户端发送数据,而其他客户端请求它。您是否有任何理由不使用标准的 HTTP 客户端/服务器,即 Web 服务器,而不是重新发明轮子?使用 Sinatra 或 Padrino,甚至是 Rails,您将基本完成。

如何跨线程存储数据?

Ruby 的 Thread 模块包括Queue,它非常适合在线程之间移动数据。文档页面有一个应该有帮助的例子。

使用队列的相同想法也适用于使用表。我建议使用数据库作为队列供您使用,而不是在内存中进行。如果它是一个内存队列并且客户端没有检索到所有数据,那么断电或应用程序崩溃将丢失所有数据。写入和读取数据库意味着数据可以经受住这些问题。

保持模式简单,在其上提供合理的索引,并且对于大多数用途来说应该足够快。您需要一些管理代码来保持数据库清洁,但使用 SQL 或像 Sequel 或 ActiveRecord 这样的 ORM 很容易。

于 2011-03-21T01:56:56.290 回答