2010-06-07 24 views
5

हैलो मैं कुछ रूबी में सॉकेट के साथ गड़बड़ कर रहा हूं और कुछ उदाहरण कोड में आया हूं कि मैंने संशोधित करने और तोड़ने की कोशिश की। मैं जानना चाहता हूं कि यह क्यों टूटा हुआ है।सॉकेट.रेसीवी काम करता है लेकिन नहीं मिलता या पढ़ता है?

सर्वर:

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

यदि किसी ने टूटा हुआ उदाहरण में पकड़ा तो मेरे पास एक अलग आईपी पता था। उस पर ध्यान न दें, जब मैं कॉपी-पेस्टिंग – Earlz

+0

इस संबंधित प्रश्न पर एक नज़र डालें, तो मैं इसे बदलना भूल गया: http://stackoverflow.com/questions/1147852/ruby-tcpsocket-write-doesnt-work-but-puts-does –

+0

दोनों आपके ग्राहक मेरे लिए ठीक काम करते हैं। मैं ओएस एक्स हिम तेंदुए पर हूँ। – Hongli

उत्तर

0

एक बहुत सूक्ष्म दौड़ की स्थिति। क्लाइंट को पूरा करने के इंतजार किए बिना आप कनेक्शन सर्वर की तरफ बंद कर रहे हैं। यदि आपका ग्राहक s.close से पहले समाप्त होता है, तो सर्वर सही होने पर आपको सही उत्तर मिल जाएगा, आपको Errno :: ECONNRESET मिलेगा। जिसका मतलब है कि काम करते समय क्लाइंट कनेक्शन खो गया।

कनेक्शन सर्वर पक्ष को बंद करने से पहले एक निश्चित समय का इंतजार करना एक साधारण कामकाज होगा। ग्राहक को खत्म करने के लिए बस पर्याप्त समय।

संबंधित मुद्दे