2010-06-07 21 views
5

你好我一直在与一些Ruby中的套接字搞混了,并遇到了一些我试图修改和破坏的示例代码。我想知道它为什么坏了。Socket.recv的作品,但没有得到或读取?

服务器:

require "socket" 
dts = TCPServer.new('127.0.0.1', 20000) 
loop do 
    Thread.start(dts.accept) do |s| 
    print(s, " is accepted\n") 
    s.write(Time.now) 
    print(s, " is gone\n") 
    s.close 
    end 
end 

客户的作品:

require 'socket' 
streamSock = TCPSocket.new("127.0.0.1", 20000) 
streamSock.print("Hello\n") 
str = streamSock.recv(100) 
print str 
streamSock.close 

客户即碎

require 'socket' 
streamSock = TCPSocket.new("127.0.0.1", 20000) 
streamSock.print("Hello\n") 
str=streamSock.read #this line modified 
print str 
streamSock.close 

我知道streamSock.print是不必要的(以及命名方案之中非红宝石),但我不明白为什么read不工作,而recv呢,这是为什么?

+0

如果有人发现在破碎的示例中我有不同的IP地址。无视这一点,我忘了去改变它时的复制粘贴 – Earlz 2010-06-07 04:45:32

+0

看看此相关的问题:http://stackoverflow.com/questions/1147852/ruby-tcpsocket-write-doesnt-work-but-puts-does – 2010-06-07 04:52:36

+0

两个你的客户对我来说工作得很好。我在OS X Snow Leopard上。 – Hongli 2010-06-07 10:41:50

回答

0

一个非常微妙的竞争条件。您正在关闭连接服务器端,而无需等待客户端完成。如果你的客户端在s.close之前完成,你将得到正确的答案,如果服务器先完成,你将得到Errno :: ECONNRESET。这意味着客户在工作时失去了连接。

一个简单的解决方法是在关闭连接服务器端之前等待一段固定的时间。只需足够的时间让客户完成。

相关问题