روبي TCPSocket يحتفظ بفقدان الاتصال
سؤال
لدي عميل وخادم. يمكنني بدء تشغيل الخادم، وتشغيل العميل، وأول مرة تعمل بشكل جيد. في المرة الثانية التي قمت بتشغيل العميل (دون إعادة تشغيل الخادم)، يظهر العميل تعليقه. هل يمكن لأي شخص أن يرى ما هو الخطأ؟
لدي عميل:
# Code example originated from p069dtclient.rb at http://rubylearning.com/satishtalim/ruby_socket_programming.html
require 'socket'
x = 0;
streamSock = TCPSocket.new( 'localhost', 20000 )
while x < 10
streamSock.send( "Hello #{x}",0 )
str = streamSock.recv( 100 )
puts "#{x} " + str
x=x+1
end
streamSock.close
والخادم:
# p068dtserver.rb
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
المحلول
يتطلب كل اتصال بالخادم مكالمة مقبولة منفصلة من أجل استلامها. ما يحدث هو أنك تقبل الأول، والعمل معها، ثم إنهاء فعليا مع ترك المقبس في حالة الاستماع. هذا يعني سيتم فتح الاتصالات، ولكن غير مقبول، لذلك يتعطلون أثناء تصفك.
قد تكون أفضل حالا باستخدام إطار خادم أكثر قوة. EventMachine (http://rubyeventmachine.com/) هو صعبة بعض الشيء للتعلم، ولكنها أقوى بكثير من حل الحل الخاص بك.
إليك إصلاح سريع قد يساعد:
require "socket"
dts = TCPServer.new('localhost', 20000)
while (s = dts.accept)
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
end
الآن يتم لف مكالمة قبول في حلقة لذلك يمكن معالجة أكثر من اتصال واحد.
لا تنتمي إلى StackOverflow