什么是从TCPServer读取的最有效方法?

时间:2009-09-21 19:59:39

标签: ruby tcpserver

我正在创建一个连接到TCP客户端的ruby服务器。我的服务器正在使用TCPServer而我正在尝试使用TCPServer :: recv(),但它不会等待数据,因此只需继续紧接循环,直到收到数据。

处理间歇性数据的最有效方法是什么?我无法更改正在发送的数据,因为我正在尝试模拟另一台服务器。从TCPServer / TCPSocket读取的语句会等待发送数据吗?


    require "socket"
    dts = TCPServer.new('localhost', 20000)
    s = dts.accept
    print(s, " is accepted\n")
    loopCount = 0;
    loop do
      Thread.start(s) do
        loopCount = loopCount + 1
        lineRcvd = s.recv(1024)
        if ( !lineRcvd.empty? )
          puts("#{loopCount} Received: #{lineRcvd}")
          s.write(Time.now)
        end
      end
    end
    s.close
    print(s, " is gone\n")

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

基于你一直在问的问题,我认为你应该尝试像EventMachine这样的框架,并编写一个实现你想要的服务器而不是试图编写服务器包装器。

话虽这么说,从套接字读取的最有效方法是使用正确的select调用并轮询所有打开的连接。虽然对于之前开发过客户端 - 服务器应用程序的人来说,这是一个相当学术性的东西,但这很麻烦,因为有很多东西你很容易出错。例如。如果您不小心避免阻止呼叫,处理多个连接可能会导致各种麻烦的情况。

EventMachine框架可以轻松开发查询/响应类型的服务器,因为您始终可以从模板开始并从那里开始工作,例如,内置的EventMachine :: Protocols :: LineAndTextProtocol作为一个很好的基础对于大多数人来说。

答案 1 :(得分:0)

你确定recv没有返回“” - 意味着套接字已关闭? 如果没有,那么也许你的套接字会以某种方式设置为非阻塞?

EventMachine确实比使用线程进行套接字编程要快得多:) GL。 -r