0

我正在创建一个连接到 TCP 客户端的 ruby​​ 服务器。我的服务器正在使用 TCPServer,并且我正在尝试使用 TCPServer::recv(),但它不等待数据,所以只是继续一个紧密的循环,直到接收到数据。

处理间歇性数据的最有效方法是什么?由于我正在尝试模拟另一台服务器,因此我无法更改正在发送的数据。TCPServer/TCPSocket 中的哪个 read like 语句会等待数据发送?


    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")

谢谢你的时间。

4

2 回答 2

0

根据您一直在问的问题,我认为您应该尝试像 EventMachine 这样的框架并编写一个实现您想要的服务器,而不是试图在编写服务器包装器时大惊小怪。

话虽如此,从套接字读取的最有效方法是使用适当的选择调用并轮询所有打开的连接。尽管对于以前开发过客户端-服务器应用程序的任何人来说,这都是一件相当学术的事情,但这是一件令人讨厌的事情,因为有很多事情很容易出错。例如。如果您不特别注意避免阻塞呼叫,则处理多个连接可能会导致各种麻烦的情况。

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

于 2009-09-21T20:26:50.390 回答
0

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

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

于 2009-09-21T23:14:21.877 回答