Ruby tcpserver客户端服务器

Ruby tcpserver客户端服务器,ruby,client,tcpserver,Ruby,Client,Tcpserver,我有一个我正在编写的应用程序,它让日志信息通过tcpsocket发送到服务器,并让一个监视器客户端连接到服务器以查看日志数据。到目前为止,我能够进入信息发送到服务器的阶段,但是我需要一些关于如何进行下一阶段的想法。使用Ruby tcpsever我可以使用什么方法让服务器将传入数据重新发送到客户端?如何跨线程存储数据 require "socket" server_socket = TCPServer.new('localhost', 2200) loop do # Creat

我有一个我正在编写的应用程序,它让日志信息通过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,您将完成大部分工作

如何跨线程存储数据

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
Ruby的线程模块包括,用于在线程之间移动数据。文档页面有一个示例,应该会有所帮助

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


保持模式简单,提供一个合理的索引,并且对于大多数使用来说应该足够快。您需要一些内务管理代码来保持数据库干净,但是使用SQL或类似于ORM的Sequel或ActiveRecord很容易做到这一点。

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

如何跨线程存储数据

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
Ruby的线程模块包括,用于在线程之间移动数据。文档页面有一个示例,应该会有所帮助

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


保持模式简单,提供一个合理的索引,并且对于大多数使用来说应该足够快。您需要一些内务管理代码来保持数据库干净,但使用SQL或类似于Sequel或ActiveRecord的ORM很容易。

关于让服务器“重新发送”数据到客户端:数据是回显到发送客户端,还是转发到另一个客户端?听起来您还没有真正决定它应该如何工作。服务器应该将数据转发给客户端服务器如何找到客户端?客户端将连接到服务器并发送一个值为viewer的字符串输入让服务器“重新发送”数据给客户端:数据是否回显到发送客户端,还是正在转发给另一个客户?听起来您还没有真正决定它应该如何工作。服务器应该将数据转发到客户端。服务器如何找到客户端?客户端将连接到服务器并使用值查看器发送字符串输入