Ruby tcpserver客户端服务器

时间:2011-03-21 01:15:38

标签: ruby client tcpserver

我有一个应用程序,我编写的日志信息通过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

1 个答案:

答案 0 :(得分:0)

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

  

如何跨线程存储数据?

Ruby的Thread模块包含Queue,这对于在线程之间移动数据很有用。文档页面有一个应该有帮助的例子。

使用队列的相同想法将适用于使用表格。我建议使用数据库充当您使用的队列,而不是在内存中执行。断电或应用程序崩溃将丢失所有数据(如果它是内存中队列并且客户端未检索到所有内容)。编写和读取数据库意味着数据可以解决这些问题。

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

相关问题