我创建其被连接到TCP客户端红宝石服务器。我的服务器使用的是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")

感谢您的时间。

有帮助吗?

解决方案

你确定的recv没有返回“” - 这意味着套接字被关闭? 如果没有,那么也许你的插口都设置为非阻塞不知何故?

EventMachine的的确远比使用线程套接字编程快:) GL。 -r

其他提示

根据您一直在问,我想你应该尝试像EventMachine的框架,写一个服务器实现你想要的,而不是试图大惊小怪周围写一个服务器包装什么的问题。

话虽这么说,从套接字读取的最有效的方法是使用一个适当的选择调用和查询所有打开的连接。虽然这是谁的前开发的客户端 - 服务器应用程序的人相当学术的东西,它是一个讨厌,因为有很多事情你可以很容易得到错误的。例如。处理多个连接,可能会导致各种麻烦的情况下,如果你不特别小心,以避免阻塞调用。

在EventMachine的框架,可以很容易地开发查询/响应型服务器,因为你总是可以从那里模板和工作启动,例如,内置EventMachine的::协议:: LineAndTextProtocol一个工程作为重要基础对于大多数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top