Ruby TCPServer套接字

时间:2010-03-09 21:30:08

标签: ruby tcpserver tcpsocket

也许我已经把我的套接字编程方式混淆了,但不应该像这样工作吗?

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

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

我几乎尝试了从客户端TCPSocket“获取”数据的所有其他方法,但是所有这些方法都挂起并且永远不会突破循环(getc,获取,读取等)。我觉得我忘记了什么。我错过了什么?

3 个答案:

答案 0 :(得分:8)

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

  • 事先知道要传达的数据量:在这种情况下,您可以使用方法read(size)代替recv(size)read阻塞,直到收到总字节数。
  • 有一个终止序列:在这种情况下,你会在recv上保持一个循环,直到你收到一个字节序列,表明通信结束。
  • 让客户端在完成通信后关闭套接字:在这种情况下,read将返回部分数据或0,recv将返回0大小数据data.empty?==true
  • 定义通信超时:您可以使用函数select,以便在一段时间后未进行任何通信时获得超时。在这种情况下,您将关闭套接字并假设每个数据都已通信。

希望这有帮助。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

没有任何东西可以写入套接字,以便client.recv(10)返回nil或false。

尝试:

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

data = ""
while (tmp = client.recv(10) and tmp != 'QUIT')
    data += tmp
end