【问题标题】:Ruby TCPServer socketsRuby TCPServer 套接字
【发布时间】:2010-03-09 21:30:08
【问题描述】:

也许我把我的套接字编程方式搞混了,但这样的东西不应该工作吗?

srv = TCPServer.open(3333)
client = srv.accept

data = ""
while (tmp = client.recv(10))
    data += tmp
end

我已经尝试了几乎所有其他从客户端 TCPSocket“获取”数据的方法,但它们都挂起并且永远不会跳出循环(getc、gets、read 等)。我觉得我忘记了什么。我错过了什么?

【问题讨论】:

    标签: ruby tcpserver tcpsocket


    【解决方案1】:

    为了编写好服务器,您需要:

    • 提前知道将要传输的数据量:在这种情况下,您可以使用read(size) 方法而不是recv(size)read 阻塞,直到收到总字节数。
    • 有一个终止序列:在这种情况下,您在recv 上保持一个循环,直到您收到指示通信结束的字节序列。
    • 让客户端在完成通信后关闭套接字:在这种情况下,read 将返回部分数据或 0,recv 将返回 0 大小数据 data.empty?==true
    • 定义通信超时:您可以使用函数select,以便在一段时间后没有通信完成时获得超时。在这种情况下,您将关闭套接字并假设所有数据都已传送。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      嗯,我在堆栈溢出时一直这样做[回答我自己的问题]。也许它会帮助别人。我找到了一种更简单的方法来做我想做的事情:

      srv = TCPServer.open(3333)
      client = srv.accept
      
      data = ""
      recv_length = 56
      while (tmp = client.recv(recv_length))
          data += tmp
          break if tmp.length < recv_length
      end
      

      【讨论】:

      • 您希望发送的序列中的最后一个块的大小可能正好是recv_length,并且循环将再次运行(错误)。
      【解决方案3】:

      没有任何内容可以写入套接字,因此client.recv(10) 返回 nil 或 false。

      试试:

      srv = TCPServer.open(3333)
      client = srv.accept
      
      data = ""
      while (tmp = client.recv(10) and tmp != 'QUIT')
          data += tmp
      end
      

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多