سؤال

لدي عميل وخادم. يمكنني بدء تشغيل الخادم، وتشغيل العميل، وأول مرة تعمل بشكل جيد. في المرة الثانية التي قمت بتشغيل العميل (دون إعادة تشغيل الخادم)، يظهر العميل تعليقه. هل يمكن لأي شخص أن يرى ما هو الخطأ؟

لدي عميل:


# 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

الآن يتم لف مكالمة قبول في حلقة لذلك يمكن معالجة أكثر من اتصال واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top