문제

여러 방문자가 연결됩니다 http://site.com/chat.php

그들은 각각 chat.php에 문자 메시지를 작성하고 보낼 수 있으며 모든 사람의 브라우저에 즉시 표시됩니다 (http://site.com/chat.php)

데이터베이스를 사용해야합니까? 내 말은, Ajax 또는 PHP 버퍼 기능이 세션의 채팅방에 충분합니까?

다른 사용자의 세션은 어떻게 서로 데이터를 공유 할 수 있습니까?

모든 아이디어 나 통찰력에 감사드립니다. 감사합니다!

편집 : 링크에 감사드립니다. 그러나 내가 원하는 것은 데이터를 클라이언트 브라우저로 푸시하는 방법입니다. 끊임없이 클라이언트 브라우저 (AJAX)가 유일한 방법입니까? 또한 여기서 도전은 다른 사용자 (예 : 2, 1 On 1)가 채팅 텍스트를 공유하는 방법입니다. 당신은 그들을 어떻게 보관합니까? 그리고 두 클라이언트간에 텍스트를 어떻게 동기화합니까? 데이터베이스를 사용하지 않는 것이 바람직합니다.

편집 2 : 실제로 yshout Peter D가 언급 한 것은이 일을 꽤 잘합니다. 브라우저를 새로 고치지 않는 것 같습니다. 그러나 새로운 메시지가 기존 사용자의 창으로 어떻게 푸시되는지 이해하지 못합니다.

도움이 되었습니까?

해결책

채팅 애플리케이션 작성을위한 3 가지 옵션이 있습니다.

소켓

프론트 엔드에는 플래시/Java 및 소켓을 사용하고 백엔드에는 소켓 가능 프로그래밍 언어를 사용하십시오. 백엔드의 경우 Java 또는 Python은 멀티 스레딩 및 NIO 가능이기 때문에 권장합니다. PHP로 수행 할 수 있습니다 (그러나 PHP는 실제로 효율적인 멀티 스레딩을 수행 할 수 없으며 일반적으로 실제로 적합하지 않습니다). 고성능이 필요한 경우 옵션입니다.

Ajax를 사용하고 당기십시오

이 경우 모든 고객은 새로운 일이 발생한 경우 지속적으로 (예 : 2 초) 폴링입니다. 그러한 간격으로 만 응답을 받기 때문에 이상하다고 느낍니다. 또한 서버와 대역폭에 상당히 부담이됩니다. 브라우저가 끊임없이 새로 고침되기 때문에 응용 프로그램 이이 기술을 사용한다는 것을 알고 있습니다. 이것은 차선책 솔루션입니다.

Ajax를 사용하고 푸시하십시오

이것은 멀티 파트-반응과 함께 작동하며 백엔드에서 오랜 실행 (PHP-) 스크립트가 있습니다. 최상의 솔루션은 아니지만 대부분의 시간은 당기는 것보다 낫고 작동하며 잘 알려진 몇 가지 채팅 앱에서 사용됩니다. 이 기술은 때때로 호출됩니다 혜성.

조언 : 제작 용도를 위해 채팅 앱이 필요한 경우 기존 앱을 설치하십시오. 프로그래밍 채팅 애플리케이션은 아닙니다 저것 쉬운.

배우려면 간단한 Ajax/Pull 앱으로 시작한 다음 Ajax를 사용하여 프로그램을 프로그램하고 푸시하십시오.

그렇습니다. 아마도 아마도 데이터베이스가 필요할 것입니다. 힘든 것은 텍스트 파일과 함께 작동하는 매우 간단한 AJAX/PULL 솔루션을 성공적으로 구현했습니다 (그러나 확실히 제작에 사용하지 않을 것입니다!).

(내 지식이지만, 확실하지만) 서버 측 백엔드없이 채팅 앱을 만들 수는 없습니다 (Frontend JavaScript만으로)!

업데이트

데이터 추진이 어떻게 수행되는지 알고 싶다면 여기서 소스를보십시오. http://wehrlos.strain.at/httpreq/client.html. 비동기 멀티 파트는 당신이 원하는 것입니다 :)

function asSendSyncMulti() {
    var httpReq = new XMLHttpRequest();

    showMessage( 'Sending Sync Multipart ' + (++this.reqCount)  );

    // Sync - wait until data arrives
    httpReq.multipart   = true;     
    httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
    httpReq.onload = showReq;
    httpReq.send( null );
}

function showReq( event ) {
    if ( event.target.readyState == 4 ) {
        showMessage( 'Data arrives: ' + event.target.responseText );
    }
    else {
        alert( 'an error occured: ' + event.target.readyState );
    }

}

showreq가 호출됩니다 매번 데이터는 일반 Ajax 요청과 마찬가지로 한 번도 도착합니다 (여기서는 jQuery 나 프로토 타입을 사용하지 않으므로 코드는 약간 비만입니다. 이것은 정말 오래되었습니다 :)).

서버 측 파트는 다음과 같습니다.

<?php

    $c = $_GET[ 'c' ];

    header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');

    sleep( 1 );

    print "--rn9012\n";
    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: First Part of Request " . $c . "\n";
    print "--rn9012\n";
    flush();

    sleep( 3 );

    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: Second Part of Request " . $c . "\n";
    print "--rn9012--\n";

?>

업데이트 2

데이터베이스와 관련하여 : 백엔드에 mod_php/cgi와 같은 공유 아키텍처가 없다면 정의 필요 약간 데이터베이스 나 텍스트 파일과 같은 외부 스토리지의 종류. 그러나 : 자신의 HTTP 서버를 작성하여 메모리에 의존 할 수 있지만 (PHP를 사용하면 가능하지만 심각한 작업을 위해 권장하지는 않습니다). 그것은 정말로 복잡하지는 않지만 아마도 당신의 질문의 범위에서 조금 벗어 났을 것입니다 ^^

업데이트 3

제가 실수를! 오랜만에 내가 실제로 그런 일을했기 때문에 모든 것을 섞어 놓았습니다. 수정 사항은 다음과 같습니다.

  1. Multipart 응답은 Mozilla 브라우저에서만 작동하므로 사용이 제한적입니다. 혜성은 다중 반응을 의미하지 않습니다.

  2. 혜성은 : 전통적인 단일 파트 응답이지만 데이터를 사용할 수있을 때까지 (무한 루프와 수면으로) 유지됩니다. 따라서 브라우저에는 모든 작업에 대해 1 개의 요청/응답 (최악의 경우)이 있습니다. 응답 할 수없는 일이 발생하지 않더라도 x 초마다 한 번의 요청이 아닙니다.

다른 팁

DB가없고 클라이언트가 업데이트를 위해 서버를 폴링하지 않고이 작업을 원한다고 언급합니다.

이론적으로 서버의 텍스트 파일에 채팅의 "로그"를 저장하고 페이지를 변경하여 사용자가 chat.php 페이지에서 요청을 받도록 페이지를 변경 하여이 작업을 수행 할 수 있지만 PHP 페이지는 실제로 다시 전송이 끝나지 않습니다. 사용자에게. (예 : 응답은 완료되지 않습니다)

당신은 몇 가지를 다시 보내야합니다.OP"메시지가 없을 때 연결을 계속 유지하기위한 데이터는 이론적으로는 이것이 효과가 있습니다.

문제는 위의 것을 달성하는 것이 여전히 많은 작업입니다. 새로운 댓글을 제출하려면 Ajax 게시물을 서버로 다시 게시해야합니다 ... 사용자의 브라우저는 전체 시간을 회전시킬 것입니다 (Iframe에 채팅 로그를 중첩하지 않는 한 - 더 많은 작업). 설정은 관리하기가 매우 어렵습니다.

다른 곳에서 무료 채팅 스크립트를 잡는 것이 좋습니다 (예 : http://tinychat.com/) 또는 자신만의 롤을 롤링하려면 (재미/경험을 위해) 계속해서 DB로 시작하여 서버에서 메시지를 밀고 당기는 페이지를 작성하십시오.

마지막으로 Ajax 요청이있는 서버를 "망치"에 대해 걱정한다면 ...하지 마십시오. 채팅 만하면 성능 문제가 있음을 발견하면 활동이 없을 때 수백 개의 요청이 채팅을 범람하지 않도록 최적화 방법에 대한 질문과 함께 StackoverFlow로 돌아갑니다.

HTTP는 쉽게 밀기 위해 만들어지지 않지만 PHP 스크립트가 종료되지 않으며 JavaScript 결과를주의 깊게 시청하여 푸시 연결을 모방 할 수 있습니다.

본질적으로 스트림 리더를 시뮬레이션하고 있습니다.

새로운 사용자가 방에 들어가기 전에 발생한 채팅 기록을로드하려면 DB 또는 기타 스토리지가 필요합니다. 학습을위한 채팅을 시도하지 않는 한, 무료로 사용하기에는 너무 많은 것이 있습니다.

http://tinychat.com 또 다른 간단한 채팅 사이트입니다.

Ajax는 잘 작동합니다. 내 사이트 중 하나에 대한 간단한 페이지를 만들었습니다. 그러나 나는 당신이 생각하는 것만 큼 자주 채팅을 사용하지 않는다는 것을 알았습니다.

데이터 공유는 조금 더 복잡해지고 IRC 서버를 호스팅하고 사용자가 데이터 교환 기능이있는 IRC 클라이언트를 사용할 수있게함으로써 달성하기가 더 쉬울 것입니다. 하나의 사용자가 사이트에 업로드하는 것을 막을 수는 없지만 다른 사용자는 다운로드합니다. 사용자가 서로 연결되어 있지 않기 때문에 웹 인터페이스를 사용하기가 어려울 것입니다.

그리고 모든 사람의 브라우저에 즉시 표시됩니다

PHP / JS를 사용하면 데이터를 서버에서 클라이언트로 푸시 할 수 없습니다. 따라서 고객은 서버에서 데이터를 요청해야합니다. 그리고 그것이 Scunliffe가 그의 직책에 묘사 한 것입니다.

다음과 같은 서비스를 사용하여 HTML 및 JavaScript로 전적으로 수행 할 수 있습니다. pubnub. 당신은 당신이 다음과 같은 것을 사용할 수 있으므로 데이터베이스가 필요하지 않습니다. 역사 API 마지막 X 채팅 메시지를 채우려면.

다음은 PubNub와 함께 채팅 앱을 구축하는 데 대한 빠른 자습서입니다.

10 줄의 코드로 실시간 채팅 앱

enter image description here

Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>

Chat Output
<div id=box></div>

<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
    channel  : channel,
    callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
    (e.keyCode || e.charCode) === 13 && PUBNUB.publish({
        channel : channel, message : input.value, x : (input.value='')
    })
} )
})()</script>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top