ما هي الطريقة الأكثر كفاءة للقراءة من TCPServer؟
سؤال
أقوم بإنشاء خادم روبي يتصل عميل 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 يعمل كأساس كبير لمعظمه.