문제

제가 현재 진행 중인 프로젝트에서는 매우 복잡한 채팅이 아닌 두 사람을 연결하여 매우 구체적인 주제에 관해 이야기할 수 있는 방법인 웹 채팅 애플리케이션을 개발해야 합니다. 어떤 종류의 인증도 필요하지 않습니다. 두 사용자 중 한 명에 대해서는 이모티콘, 아바타 등을 지원할 필요가 없습니다.

일부 프로젝트 멤버는 BOSH를 통해 XMPP를 사용할 수 있다고 제안했고 저는 그것은 마치 배의 그물로 물고기를 잡는 것과 같다고 말하며 간단한 Ajax/MySQL 웹 채팅과 같은 더 간단한 방법을 제안했지만 성능이 걱정됩니다. 동시에 열려 있는 많은 채팅에 대한 지속적인 폴링으로 인해 서버에 접속했습니다.

이전에 이런 일을 한 사람이 있습니까?무엇을 추천하나요?

도움이 되었습니까?

해결책

당신은 또한 조사하고 싶을 수도 있습니다 혜성.

GTalk, Meebo 등에서 사용됩니다. 다른 채팅 애플리케이션.몇 년 전 제가 실험할 당시에는 이를 구현할 서버 아키텍처에 대한 라이브러리나 세부 사항이 그리 많지 않았지만 지금은 훨씬 더 많은 것들이 있는 것 같습니다.

다음을 살펴보세요. 혜성 더 많은 기술 정보를 위한 프로젝트입니다.

다른 팁

무엇을 추천하나요?

BOSH를 통한 XMPP

다른 사람이 가지고 있는 것처럼 자신만의 메시지 형식과 전송 프로토콜을 만들 필요가 없습니다.시도해 보면 천천히 BOSH만큼 복잡해지지만 타사 라이브러리 지원이나 표준화의 이점은 없습니다.

HTTP 폴링 아이디어가 마음에 들지 않으면 서버의 일부 데몬과 지속적으로 연결되어 있는 채팅 페이지의 플래시 영화를 가질 수 있습니다. 그런 다음 플래시 영화는 클라이언트에서 JavaScript 함수를 호출하여 업데이트합니다. 새 메시지가 오면 채팅이 옵니다.(채팅에 플래시 인터페이스를 원하지 않는 한..)

Comet을 살펴보고 싶을 수도 있습니다.

나는 모든 사람들이 이런 종류의 일에 Cometd를 사용한다고 생각했습니다.

BOSH는 HTTP를 통해 XMPP를 전송하기 위한 표준입니다.클라이언트에 데이터를 푸시하기 위해 Comet이 필요합니다.

서버에서 브라우저로 푸시되는 메시지를 처리하는 데 아주 좋은 서버가 있습니다. 혜성) - 궤도를 돌다.Memcached와 마찬가지로 다른 기술(Django, Rails, PHP 등)과 쉽게 통합됩니다.

심각한 부하를 처리하려면 꼭 확인해야 합니다.그렇지 않으면 간단한 Ajax 폴링이 가장 좋은 방법입니다.

비결은 앱이 서버에서 CGI를 호출해야 하는 유일한 시간은 누군가가 무언가를 말할 때라는 점을 깨닫는 것입니다.정기적인 설문 조사의 경우 새 채팅이 있을 때마다 CGI 스크립트가 업데이트하는 정적 페이지를 폴링합니다.HEAD 요청을 사용하고, 타임스탬프를 마지막으로 본 것과 비교하고, 변경된 경우에만 전체 GET을 수행하세요.나는 이런 방식으로 구현된 간단한 순진한 채팅 애플리케이션을 가지고 있으며, 수십 명의 동시 사용자에 대한 로드 및 대역폭 사용량은 무시할 수 있습니다.

나는 몇 달 전에 이와 똑같은 일을 했고 개념을 가지고 놀면서 재미있게 놀았습니다.나는 실제로 영원히 프레임 폴링 대신 기술.

아래 코드는 "파티 채팅" 설정을 얻는 데 필요한 일반 개념이 포함된 "comet" js 파일입니다.

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

점검 Speqe.그것은 오픈소스 솔루션 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