Ruby tcpserver 客户端服务器

标签 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

最佳答案

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

How can I have data stored across threads?

Ruby 的线程模块包括 Queue ,这有利于在线程之间移动数据。文档页面有一个示例应该有所帮助。

使用队列的相同想法也适用于使用表。我建议使用数据库作为您使用的队列,而不是在内存中执行。如果它是内存队列并且客户端没有检索到所有内容,则断电或应用程序崩溃将丢失所有数据。写入和读取数据库意味着数据可以在此类问题中幸存下来。

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

关于Ruby tcpserver 客户端服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372911/

相关文章:

ruby-on-rails - Heroku Drop Table Rails 帮助

ruby - Markdown 到 Ruby 中的纯文本?

java - 具有多客户端的 ServerSocket

c# - 与 Socket 相比,使用 TcpClient 和 Tcp Server 有何优势

Java TCP 服务器一次发送更多消息

jquery - 将 Parsley 与 rails 6 一起使用

ruby - ruby 中的自定义日期时间格式?

Java 通过套接字发送和接收文件 (byte[])

c# - 存储数据集的最佳方式(在表中)

java - 如何将两个套接字绑定(bind)到两个单独程序上的同一端口?