كيفية تحديد زمن الوصول للخادم البعيد من خلال المتصفح

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

سؤال

أقوم بتشغيل اثنين من خوادم نفق الألعاب وأرغب في الحصول على صفحة يمكن للعميل من خلالها تشغيل اختبار ping على جميع الخوادم ومعرفة أيها أكثر استجابة.بقدر ما أستطيع أن أرى، يبدو أنه لا توجد طريقة مناسبة للقيام بذلك في JavaScript، لكنني كنت أفكر، هل يعرف أي شخص طريقة للقيام بذلك في الفلاش أو ربما بعض تقنيات متصفح العميل الأخرى؟

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

المحلول

تفرض معظم تقنيات التطبيقات الصغيرة، بما في ذلك Javascript، سياسة المصدر نفسه.قد يكون من الممكن إضافة عناصر DOM ديناميكيًا، مثل الصور، وجمع معلومات التوقيت باستخدام معالج حدث onload.

رمز زائف

for (server in servers) {
  var img = document.createElement('IMG');
  server.startTime = getCurrentTimeInMS();
  img.onload=function() { server.endTime = getcurrentTimeInMS(); }
  img.src = server.imgUrl;
}

ثم انتظر وقتًا مناسبًا وتحقق من توقيت كل كائن خادم.كرر ذلك حسب الحاجة واحسب المتوسطات إذا أردت.لست متأكدًا من نوع الدقة التي يمكنك توقعها.

سلبيات:

  • من المحتمل أنك تستخدم الأداة الخاطئة لهذه المهمة.المتصفح غير مجهز لهذا النوع من التطبيقات.
  • ربما يكون غير دقيق تمامًا.
  • إذا كان المورد الذي تطلبه مخزّنًا مؤقتًا، فلن يمنحك النتائج التي تريدها، ولكن يمكنك التغلب على ذلك عن طريق تغيير عنوان URL في كل مرة.
  • يعد هذا كثيف النطاق الترددي مقارنة بـ ping العادي.جعل الصورة صغيرة، مثل ملف spacer.gif.
  • لا يعتمد التوقيت على زمن الوصول للخادم البعيد فحسب، بل يعتمد أيضًا على النطاق الترددي لذلك الخادم.قد يكون هذا إجراءً مفيدًا إلى حد ما، ولكن من المهم ملاحظة أن الأمر لا يتعلق فقط بزمن الاستجابة.
  • يجب أن تكون قادرًا على خدمة طلبات HTTP من الخوادم المختلفة، والأهم من ذلك، يجب أن يخدم كل خادم نفس المورد بالضبط (أو موردًا بنفس الطول).يمكن أن تؤثر الظروف الموجودة على الخادم على وقت الاستجابة، كما لو كان أحد الخوادم يقوم بضغط البيانات بينما لا يقوم خادم آخر بذلك.

نصائح أخرى

وقبل الدعوة إلى الملقم، تسجيل الوقت جافا سكريبت:

var startTime = new Date();

وتحميل صورة من الخادم:

var img = new Image()
img.onload = function() {
    // record end time
}
img.src = "http://server1.domain.com/ping.jpg";

وحالما يتم الانتهاء من الطلب، تسجيل الوقت مرة أخرى. (نظرا بالطبع أن الطلب لم مهلة.)

var endTime = new Date();

وبينغ الخاص بك في ميلي ثانية هو:

var ping = endTime. getTime() - startTime.getTime();

وجميع ما تحتاجه حقا هو الوقت من البداية الصدد، إلى وقت التغيير ReadyState عن الأول ...

function getPing() {
  var start;
  var client = getClient(); // xmlhttprequest object
  client.onreadystatechange = function() {
    if (client.readyState > 0) {
      pingDone(start); //handle ping
      client.onreadystatechange = null; //remove handler
    } 
  }

  start = new Date();
  client.open("HEAD", "/ping.txt"); //static file
  client.send();
}

function pingDone(start) {
  done = new Date();
  ms = done.valueOf() - start.valueOf();
  alert(ms + "ms ping time");
}

function getClient() {
  if (window.XMLHttpRequest)
    return new XMLHttpRequest();

  if (window.ActiveXObject)
    return new ActiveXObject('MSXML2.XMLHTTP.3.0');

  throw("No XMLHttpRequest Object Available.");
}

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

هنا <iframe> يقترب:


(مصدر: Magnetiq.com)

قم بإنشاء جدول (ليس بالضرورة بالمعنى الحرفي <table> بمعنى) مع عمودين.سيحتوي العمود الأول على أسماء الخوادم (وربما روابط إليها).يحتوي العمود الثاني على إطارات iframe التي تقوم بتحميل مستندات الاختبار من الخوادم المعنية.تقوم كل وثيقة اختبار بذلك عند طلب الجلب الأولي:

  1. احصل على وقت النظام الحالي
  2. قم بإعادة التوجيه (302) إلى مستند اختبار ثانٍ أثناء تمرير وقت النظام كمعلمة استعلام
  3. تقرأ وثيقة الاختبار الثانية وقت النظام الحالي، وتحسب الدلتا من القراءة الأولية التي تم تمريرها إليها وتعرضها بأحرف كبيرة فقط.ستكون هذه الدلتا هي الوقت الذي يستغرقه الخادم للرد على العميل باستجابة إعادة التوجيه بالإضافة إلى الوقت الذي يستغرقه العميل لتقديم الطلب الثاني إلى هدف إعادة التوجيه.إنه ليس "ping" بالضبط ولكنه مقياس مشابه لوقت الاستجابة النسبي للعميل مع كل خادم.في الواقع، إنه "أمر ping عكسي" من الخادم إلى العميل.

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

إذا كنت تتحدث عن تشغيل العميل شيء، وأنا لست متأكد من أن هذا أمر ممكن نظرا لأسباب أمنية.

وربما سيكون أفضل رهان يكون برنامج جافا - ولكن مرة أخرى هذا يحتاج إلى أن يتم التحقق ضد نهج الأمان المحلي

إذا كنت في محاولة للتفكير حول بعض الإختراق في JS للقيام بذلك، وربما يمكنك محاولة إرسال طلب المتزامن مع وظيفة الاستدعاء الذي يقيس ميلي ثانية استغرق الأمر - ولكن هذا هو مجرد من على قمة رأسي

وانها ليست من الصعب قياس زمن استجابة الخادم في فلاش.

وفلاش يجب أن نسأل عن ملف السياسة قبل الوصول إلى خدمة المناطق النائية. الموقع الافتراضي لملف السياسة هذا هو في المجلد الجذر من الخادم: /crossdomain.xml

و(يمكنك بسهولة العثور على معلومات حول تنسيق ملف crossdomain)

وبما أن هناك حاجة إلى هذا الملف على أية حال، لماذا لا تستخدم لقياس زمن استجابة الخادم؟ تحميل الملف نفسه بدلا من صورة وقياس الوقت الذي استغرقه باستخدام getTimer ().

وهذا سوف اعطيكم تقدير جيد على اتصالات HTTP.

ولكن إذا كنت تتعامل مع خوادم اللعبة، فإنك قد ترغب في التحقق مباشرة سرعة اتصال TCP. للقيام بذلك ستحتاج إلى استخدام flash.net.Socket سيكون لديك أيضا أن نسأل عن ملف السياسة لأول مرة عن طريق تشغيل: Security.loadPolicyFile ( "xmlsocket: //server.domain.com: 5342")؛

وأين يمثل 5342 رقم منفذ الملقم الخاص بك حيث ينبغي أن تستجيب مع سلسلة سياسة XML المناسبة. بعد إجراء الاتصال مأخذ، وأي طلب / استجابة تمكنك من قياس مختلف أوقات الاستجابة الخادم.

والمشكلة مع "الأصوات الملف 'هي أنك ستقيم الاستجابة المتشعب الخادم حين الموارد المستهدفة للحصول على الألعاب التي تخدم قد يكون له سلوك مختلف للغاية، وبالتالي الكمون مختلفة.

مجرد فكرة من فراغ، وربما حتى غير واقعي اعتمادا على السياق الفعلي: ولكن، لن تكون مثيرة للاهتمام لجعل برنامج نصي خادم يستند على سلسلة قصيرة من المهام التي تنفذها عادة خوادم أثناء اللعب (على سبيل المثال فتح اتصال RTMP واسترجاع للمعلومات، أن يعيدها). اعتمادا على عدد من الخوادم، يمكن تقريبا فتحها في وقت واحد وتحديد الاستجابة الأولى للفوز في (طرح الوقت يتطلب العميل بشكل مستقل لمعالجة كل الاستعلام).

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

واستنادا إلى ردودMr. لامعة وGeorg Schölly، مثال كاملة وعلق.

في أجل اختبار، مجرد نسخ ولصق الرموز أدناه في نفس الترتيب، في هتمل فارغة، فب أو ملف متوافق آخرين.

وقبل البدء في الحصول عليها، تسجيل الوقت جافا سكريبت الحالي. باستخدام new Date()، ونحن خلق كائن موعد جديد مع التاريخ والوقت الحالي.

<script type="text/javascript">

var startTime = new Date();

والآن دعونا خلق صورة الكائن أتش تي أم أل، لا يزال دون مصدر، ويعزو ذلك إلى IMG متغير.

var img = new Image();

ويتم وضع سبيت المقبل مصدر في الصورة. يعكس .src ال src أتش تي أم أل. مهم! تشير img.src إلى ملف صورة صغيرة جدا وخفيفة الوزن، وإذا كان ذلك ممكنا أي شيء أقل من 10KB.

لمنع مخبأ تمت إضافة معلمة عشوائية في نهاية الملف، بعد تمديد بابوا نيو غينيا.

var random_string = Math.random().toString();
img.src = "http://static.bbci.co.uk/frameworks/barlesque/5.0.0/orb/4/img/bbc-blocks-dark.png" + "?" + random_string;

والآن يمكن أن نسميه وظيفة لدينا والتي سوف تعمل فقط عند تحميل صورة، لأن .onload:

img.onload = function() {
    var endTime = new Date();
    var ping = endTime. getTime() - startTime.getTime();
    alert(img.src + " loaded in " + ping + " ms");
}
</script>

وداخل وظيفة لدينا ENDTIME المتغير الذي يحصل على التاريخ والوقت بعد أن تم تحميل الصورة المصدر.

وأخيرا، يتلقى متغير بينغ الوقت الأولي ناقص مرة الأخيرة. يظهر المنبثقة في حالة تأهب النتيجة.

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