2010-06-07 30 views
5

Xin chào Tôi đã rối tung xung quanh với Sockets trong Ruby một số và đi qua một số mã ví dụ mà tôi đã cố gắng sửa đổi và phá vỡ. Tôi muốn biết tại sao nó bị hỏng.Socket.recv hoạt động nhưng không được đọc hoặc đọc?

Server:

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 

Client hoạt động:

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

Client được chia

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

Tôi biết rằng streamSock.print là không cần thiết (cũng như sơ đồ đặt tên con không ruby) nhưng tôi không hiểu tại sao read không hoạt động trong khi recv, Tại sao lại như vậy?

+0

nếu có ai phát hiện ra trong ví dụ bị hỏng, tôi có một địa chỉ IP khác. bỏ qua điều đó, tôi quên thay đổi nó khi sao chép-dán – Earlz

+0

Hãy xem câu hỏi liên quan này: http://stackoverflow.com/questions/1147852/ruby-tcpsocket-write-doesnt-work-but-puts-does –

+0

Cả hai khách hàng của bạn làm việc tốt cho tôi. Tôi đang ở trên OS X Snow Leopard. – Hongli

Trả lời

0

Điều kiện đua rất tinh tế. Bạn đang đóng máy chủ kết nối mà không đợi máy khách hoàn thành. Nếu khách hàng của bạn kết thúc trước khi s.close, bạn sẽ nhận được câu trả lời đúng, nếu máy chủ kết thúc trước, bạn sẽ nhận được Errno :: ECONNRESET. Điều đó có nghĩa là khách hàng bị mất kết nối trong khi làm việc.

Cách giải quyết đơn giản là đợi một khoảng thời gian cố định trước khi đóng phía máy chủ kết nối. Chỉ đủ thời gian để khách hàng hoàn tất.

Các vấn đề liên quan