4

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

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

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

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

4

3 回答 3

8

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

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

希望这可以帮助。

于 2010-03-09T23:12:08.783 回答
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
于 2010-03-09T21:47:38.807 回答
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
于 2010-03-09T21:53:36.360 回答