ما هي الطريقة الأكثر كفاءة للقراءة من TCPServer؟

StackOverflow https://stackoverflow.com/questions/1456520

  •  12-09-2019
  •  | 
  •  

سؤال

أقوم بإنشاء خادم روبي يتصل عميل TCP. خادم خادمي يستخدم tcpserver وأنا أحاول استخدام tcpserver :: recv ()، ولكن لا تنتظر البيانات، لذلك لا يزال فقط في حلقة ضيقة حتى يتم استلام البيانات.

ما هي الطريقة الأكثر كفاءة لمعالجة البيانات المترسة؟ أنا غير قادر على تغيير البيانات التي يتم إرسالها منذ أن أحاول محاكاة خادم آخر. أي قراءة مثل بيان من TCPServer / TCPSocket ستنتظر البيانات التي يتم إرسالها؟


    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")

شكرا على وقتك.

هل كانت مفيدة؟

المحلول

هل أنت متأكد من أن Recv لا يعود "" - بمعنى المقبس مغلق؟ إذا لم يكن الأمر كذلك، فربما يتم تعيين مآخذك على عدم حظر بطريقة أو بأخرى؟

EventMachine هو في الواقع أسرع بكثير من استخدام خيوط برمجة المقبس :) GL. أدرك

نصائح أخرى

بناء على الأسئلة التي كنت تسأل، أعتقد أنك يجب أن تجرب إطارا مثل EventMachine واكتب خادم يقوم بتنفيذ ما تريد بدلا من محاولة ضجة حول كتابة مجمع الخادم.

يقال إن الطريقة الأكثر كفاءة للقراءة من المقبس هي استخدام مكالمة محددة مناسبة واستطلاع جميع الاتصالات المفتوحة. في حين أن هذا شيء أكاديمي إلى حد ما بالنسبة لأي شخص يطور تطبيقات خادم العميل من قبل، فهو مصدر إزعاج لأن هناك الكثير من الأشياء التي يمكنك بسهولة الحصول عليها بسهولة. علي سبيل المثال. يمكن أن يؤدي التعامل مع اتصالات متعددة إلى جميع أنواع المواقف المزعجة إذا كنت لا توثق بشكل خاص في تجنب حظر المكالمات.

يجعل EventMachine Frameworm من السهل تطوير خوادم Query / Responsion من نوع الاستجابة لأنه يمكنك دائما البدء في القالب والعمل من هناك، على سبيل المثال، الحدث EventMachine المدمج :: البروتوكولات :: LeneandtextProtocol One يعمل كأساس كبير لمعظمه.

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