سؤال

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

اقترح بعض أعضاء المشروع أنه يمكننا استخدام XMPP من خلال BOSH، وقلت إن ذلك يشبه محاولة اصطياد سمكة بشبكة القارب، واقترحت طريقة أبسط، مثل محادثة ويب بسيطة عبر Ajax/MySQL، لكننا قلقون بشأن الأداء ضرب في الخادم بسبب الاقتراع المستمر للعديد من الدردشات المفتوحة في نفس الوقت.

هل قام أحد بشيء مثل هذا من قبل؟ماذا تنصح؟

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

المحلول

قد ترغب أيضا في النظر في المذنب.

يتم استخدامه بواسطة GTalk وMeebo والعديد تطبيقات الدردشة الأخرى.قبل بضع سنوات عندما كنت أقوم بتجربته، لم يكن هناك الكثير من المكتبات أو التفاصيل حول بنية الخادم لتنفيذه، ولكن يبدو أن هناك الكثير من الأشياء الآن.

الق نظرة على cometd مشروع لمزيد من المعلومات التقنية.

نصائح أخرى

ماذا تنصح؟

XMPP من خلال BOSH

ليست هناك حاجة لاختراع تنسيق الرسائل وبروتوكول النقل الخاص بك عندما يقوم شخص آخر بذلك.إذا حاولت، فسوف ينمو ببطء ليصبح معقدًا مثل BOSH ولكن دون الاستفادة من دعم أو توحيد مكتبة الطرف الثالث.

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

قد ترغب أيضًا في إلقاء نظرة على Comet.

اعتقدت أن الجميع استخدموا Cometd لهذا النوع من الأشياء.

يعد BOSH معيارًا لنقل XMPP عبر HTTP.أنها تنطوي على المذنب لدفع البيانات إلى العميل.

يوجد خادم جيد جدًا للتعامل مع دفع الرسائل من خادم إلى متصفح (يُطلق عليه اسم المذنب) - مدار.يمكن دمجه بسهولة مع التقنيات الأخرى (Django، Rails، PHP وما إلى ذلك) تمامًا مثل memcached.

يجب عليك حقًا التحقق من ذلك إذا كنت تريد التعامل مع الحمل الخطير.بخلاف ذلك، فإن استطلاع Ajax البسيط هو أفضل طريقة.

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

لقد فعلت نفس الشيء منذ بضعة أشهر واستمتعت بالتلاعب بالمفاهيم.لقد استخدمت فعلا إلى الأبد الإطار التقنية بدلا من الاقتراع.

الكود أدناه هو ملف js "comet" الخاص بي والذي يحتوي على المفاهيم العامة المطلوبة للحصول على إعداد "دردشة جماعية".

function Comet(key) {

  var random = key;
  var title = 'Comet';
  var connection = false;
  var iframediv = false;
  var browserIsIE = /*@cc_on!@*/false;
  var blurStatus = false;
  var tmpframe = document.createElement('iframe');
  var nl = '\r\n';

  this.initialize = function() {
    if (browserIsIE) {
      connection = new ActiveXObject("htmlfile");
      connection.open();
      connection.write("<html>");
      connection.write("<script>document.domain = '"+document.domain+"'");
      connection.write("</html>");
      connection.close();
      iframediv = connection.createElement("div");
      connection.appendChild(iframediv);
      connection.parentWindow.comet = comet;
      iframediv.innerHTML = "<iframe id='comet_iframe' src='./comet.aspx?key="+random+"'></iframe>";
    } else {
      connection = document.createElement('iframe');
      connection.setAttribute('id', 'comet_iframe');
      iframediv = document.createElement('iframe');
      iframediv.setAttribute('src', './comet.aspx?key='+random);
      connection.appendChild(iframediv);
      document.body.appendChild(connection);
    }
  }

  // this function is called from the server to keep the connection alive
  this.keepAlive = function () {
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  // this function is called from the server to update the client
  this.updateClient = function (value) {
    var outputDiv = document.getElementById('output');
    outputDiv.value = value + nl + outputDiv.value;
    if (blurStatus == true) {
        document.title = value;
    }
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  this.onUnload = function() {
    if (connection) {
      // this will release the iframe to prevent problems with IE when reloading the page
      connection = false;
    }
  }

  this.toggleBlurStatus = function(bool) {
    blurStatus = bool;
  }

  this.resetTitle = function() {
    document.title = title;
  }

  function mozillaHack() {
    // this hack will fix the hour glass and loading status for Mozilla browsers
    document.body.appendChild(tmpframe);
    document.body.removeChild(tmpframe);
  }
}

اعتقدت أن الجميع استخدموا Cometd لهذا النوع من الأشياء.

وأنا أتفق مع جون.ولكن كان هناك سؤال آخر لم تتم الإجابة عليه.
لقد قمت بذلك ولكن بدلاً من استخدام قاعدة بيانات استخدمنا ملفًا ثابتًا، فقد أدى ذلك في النهاية إلى شل الخادم، ولكن لم يكن الأمر كذلك حتى أصبح لدينا ما يقرب من 450 مستخدمًا نشطًا، وإذا فعلنا ذلك باستخدام قاعدة بيانات، فمن المحتمل أن يكون ذلك ناجحًا أحسن.
تم ذلك على حساب استضافة أساسي من Godaddy.

يحرر:راجع للشغل Godaddy بدا أقل تسلية عندما تلقيت المكالمة الهاتفية.

أعتقد أن الاقتراع هو أبسط نهج وأوصي بذلك أولاً.إذا أصبح الحمل يمثل مشكلة، فابدأ بالبحث في تقنيات أكثر تعقيدًا.هناك مناقشة جيدة حول الإيجابيات والسلبيات هنا -http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

الدفع سبيكي.انه حل مفتوح المصدر لغرف الدردشة المستندة إلى الويب والتي تستخدم BOSH وXMPP خلف الكواليس.

لقد وجدت هذا المنشور للتو، وهو قديم، ولكن مفهوم الاقتراع يسبب مشاكل لكثير من الناس.لذلك سأضع مثالاً للتنفيذ هنا.ولكن قبل أن أقدمها لك، أود أن أقدم لك نصيحة أثارت غضبي منذ فترة:

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

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

نصيحة:استخدام أداة مثل فايربوغ لنرى ما يحدث.

الآن دعونا نتحدث بلغة أفضل من لغتي الإنجليزية:

<?php

    // For this demo
    if (file_exists('poll.txt') == false) {
        file_put_contents('poll.txt', '');
    }

    if (isset($_GET['poll'])) {

        // Don't forget to change the default time limit
        set_time_limit(120);

        date_default_timezone_set('Europe/Paris');
        $time = time();

        // We loop until you click on the "release" button...
        $poll = true;
        $number_of_tries = 1;
        while ($poll)
        {
            // Here we simulate a request (last mtime of file could be a creation/update_date field on a base)
            clearstatcache();
            $mtime = filemtime('poll.txt');

            if ($mtime > $time) {
                $result = htmlentities(file_get_contents('poll.txt'));
                $poll = false;
            }

            // Of course, else your polling will kill your resources!
            $number_of_tries++;
            sleep(1);
        }

        // Outputs result
        echo "Number of tries : {$number_of_tries}<br/>{$result}";
        die();
    }

    // Here we catch the release form
    if (isset($_GET['release']))
    {
        $data = '';
        if (isset($_GET['data'])) {
            $data = $_GET['data'];
        }
        file_put_contents('poll.txt', $data);
        die();
    }

?>

<!-- click this button to begin long-polling -->
<input id="poll" type="button" value="Click me to start polling" />

<br/><br/>

Give me some text here :
<br/>
<input id="data" type="text" />
<br/>

<!-- click this button to release long-polling -->
<input id="release" type="button" value="Click me to release polling" disabled="disabled" />

<br/><br/>

Result after releasing polling :
<div id="result"></div>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

// Script to launch polling
$('#poll').click(function() {
    $('#poll').attr('disabled', 'disabled');
    $('#release').removeAttr('disabled');
    $.ajax({
        url: 'poll.php',
        data: {
            poll: 'yes' // sets our $_GET['poll']
        },
        success: function(data) {
            $('#result').html(data);
            $('#poll').removeAttr('disabled');
            $('#release').attr('disabled', 'disabled');
        }
    });
});

// Script to release polling
$('#release').click(function() {
    $.ajax({
        url: 'poll.php',
        data: {
            release: 'yes', // sets our $_GET['release']
            data: $('#data').val() // sets our $_GET['data']
        }
    });
});

</script>

يمكنك تجربتها هنا

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