Pergunta

Vários visitantes conectar a http://site.com/chat.php

Cada um deles pode escrever e enviar uma mensagem de texto para chat.php e exibe instantaneamente no navegador de todos ( http: //site.com/chat.php )

Eu tenho que usar um banco de dados? Quero dizer, é AJAX ou PHP tampão capacidades suficientes para tal sala de chat em sessões?

Como pode sessões de diferentes usuários compartilhar dados entre si? ??

Qualquer idéia ou idéias serão apreciadas, obrigado!

Edit: Obrigado pelas ligações. Mas o que eu quero é a maneira de enviar dados para um navegador cliente. Está constantemente atualizando o navegador do cliente (AJAX ou não) a única maneira? Além disso, o desafio aqui é a forma como diferentes usuários, por exemplo, 2, 1 a 1, textos de bate-papo share? Como você armazená-los? E como você sincronizar os textos entre os 2 clientes? Não usando um banco de dados de preferência.

Editar 2: Na verdade YShout mencionado por Peter D faz este trabalho muito bem. Não parece para manter atualização do navegador. Mas eu não entendo como ele empurra as novas mensagens para a janela do usuário existente.

Foi útil?

Solução

Existem (aproximadamente) 3 opções para criar uma aplicação de chat:

soquetes

flash de uso / java e tomadas para o frontend e uma linguagem de programação de socket com capacidade para o backend. para o backend, eu recomendo java ou python, porque eles são multithreading e NIO-capable. é possível fazê-lo com PHP (mas php não pode realmente fazer multithreading eficiente e geralmente não é realmente adequado para isso). esta é uma opção se você precisa de alta performance, e provavelmente não o que você está procurando.

ajax uso e puxar

Neste caso todos os clientes estão constantemente (por exemplo, sempre 2 segundos), polling se algo novo aconteceu. ele se sente estranho, porque você só obter respostas nesses intervalos. Além disso, ele coloca bastante pressão sobre o seu servidor e largura de banda. você sabe que um aplicativo usa essa técnica porque o navegador constantemente atualizada. esta é uma solução sub-óptima.

ajax uso e impulso

isso funciona com várias vias respostas e tem longa duração (PHP) scripts no backend. não é a melhor solução, mas na maioria das vezes é melhor do que puxar e ele funciona e é usado em várias aplicações de chat bem conhecidos. esta técnica é às vezes chamado COMET .

meu conselho: se você precisa de um aplicativo de bate-papo para uso em produção, instale um já existente. programar aplicações de chat não é que fácil.

Se você quer apenas aprender, começar com um aplicativo ajax / tração simples, em seguida, tentar um programa usando ajax e empurrar.

e sim, provavelmente você vai precisar de um banco de dados, resistente i implementou com sucesso uma solução ajax / puxar muito simples que funciona com arquivos de texto para se divertir (mas eu certamente não iria utilizá-lo na produção!).

é (a meu conhecimento, mas eu tenho certeza), não é possível criar um aplicativo de bate-papo sem um backend do lado do servidor (com apenas frontend javascript sozinho)!

Atualização

Se você quiser saber como os dados empurrando é feito, olhar para a fonte aqui: http: //wehrlos.strain.at/httpreq/client.html . async multipart é o que você quer:)

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 é chamado cada vez dados chegam, não apenas uma vez como em AJAX pedidos regulares (eu não estou usando jQuery ou protótipo aqui, então o código é um pouco obeso - este é realmente velho: )).

aqui é a parte do lado do servidor:

<?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";

?>

Update2

em relação ao banco de dados: se você tem uma arquitetura shared-nada como mod_php / cgi no back-end, você definitley necessidade alguns tipo de armazenamento externo, como bancos de dados ou textfiles. mas: você pode confiar na memória, escrevendo seu próprio servidor http (possível com php, mas eu não recomendo-o para um trabalho sério). Isso não é realmente complicado, mas provavelmente um pouco fora do âmbito da sua pergunta ^^

Update3

Eu cometi um erro! tem tudo misturado, porque já faz muito tempo eu realmente fiz algo parecido. aqui estão as correções:

  1. respostas de várias único trabalho com os navegadores Mozilla e, portanto, são de uso limitado. COMET faz multipart-resposta não média.

  2. Comet: meios de resposta singlepart tradicional, mas realizada (com um ciclo infinito e o sono) até há dados disponíveis. de modo que o navegador tem um pedido / resposta para cada ação (no pior caso), nem uma solicitação a cada x segundos, mesmo se nada resposta digna acontece.

Outras dicas

Você menciona querer isso para o trabalho sem um DB, e sem que o cliente (s) interrogar o servidor de atualizações.

Em teoria, você pode fazer isso armazenando o "log" de conversas em um arquivo de texto no servidor, e mudando sua página para que o usuário faz um pedido GET na página chat.php, mas a página PHP na verdade nunca termina de enviar de volta para o usuário. (Por exemplo, a resposta nunca é concluída)

Você precisa enviar de volta alguns " nenhum op " dados para manter a conexão vai quando não há mensagens, mas, em teoria, isso iria funcionar.

O problema é que, para realizar o acima ainda é um monte de trabalho. Você precisa fazer os posts AJAX de volta para o servidor para enviar novos comentários ... navegador dos usuários seria girando o tempo todo (a menos que você ninho log de bate-papo em um iframe - eg mais trabalho) ... e este tipo de configuração só iria ser muito difícil de gerir.

Eu sugiro pegar um script de chat livre de outro lugar (por exemplo http://tinychat.com/ ) ou se você desejar construir sua própria (para diversão / experiência), então vá em frente, mas começar com um banco de dados e construir uma página que vai empurrar e puxar as mensagens do servidor.

Finalmente, se você está preocupado com a "martelar" o servidor com solicitações de AJAX ... não. Basta construir o bate-papo, em seguida, se você descobrir que há problemas de desempenho, retorno à StackOverflow com uma pergunta sobre como otimizá-lo para que centenas de pedidos não estão inundando o bate-papo quando não há atividade.

Enquanto o HTTP não é feita para fácil empurrar, você pode emular uma conexão impulso por ter o script PHP não terminar eo resultado JavaScript ser observados cuidadosamente.

Essencialmente, você está simulando um leitor de fluxo.

Se você gostaria novos usuários para carregar um histórico do bate-papo que ocorreram antes de entrarem na sala, a DB ou outro armazenamento é necessário. A menos que você está tentando criar uma conversa para aprender, há muitos lá fora, para utilizar gratuitamente a incomodar.

http://tinychat.com é outro chat site simples.

AJAX funciona bem. Criei uma página simples para um dos meus sites. Mas acho que o chat não se acostumar tão frequentemente como você pensaria.

O compartilhamento de dados fica um pouco mais complicado e seria mais fácil de realizar, hospedando um servidor de IRC e permitindo que os usuários clientes uso de IRC que têm capacidade de troca de dados. Embora nada está impedindo você de ter de upload de um usuário para o site, em seguida, outros download. Pessoa para pessoa seria difícil com o uso de uma interface web, porque os usuários não estão conectados de alguma forma com o outro.

e exibe instantaneamente no navegador de todos

Com php / JS você não pode empurrar os dados do servidor para os clientes. Assim, seus clientes precisam para pedir os dados do servidor. E é isso que scunliffe descreveu em seu posto.

Você pode fazer isso inteiramente com HTML e Javascript usando um serviço como PubNub . Você não precisa de um banco de dados como você poderia usar algo como o história api para preencher as mensagens de chat últimos x.

Aqui está um rápido tutorial sobre a construção de um aplicativo de bate-papo com PubNub.

chat em tempo real Aplicativos em 10 linhas de código

enter descrição da imagem aqui

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top