2012-12-16 10 views
8

Sto cercando di creare una chat PHP, quindi devo server.php che avvia il server sul terminale, che è ascoltare client connessioni:Creazione di un client per una chiacchierata in PHP

<?php 

function chat_leave($sock, $chat_id = 0) 
{ 
    if($chat_room_id[ $chat_id ]) 
    { 
     unset($chat_room_id[ $chat_id ]); 
     return true; 
    } 
    socket_close($sock); 
    return false; 
} 

function client($input) 
{ 
    /* 
    Simple php udp socket client 
    */ 

    //Reduce errors 
    error_reporting(~E_WARNING); 

    $server = '127.0.0.1'; 
    $port = 9999; 

    if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))) 
    { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 

     die("Couldn't create socket: [$errorcode] $errormsg \n"); 
    } 

    //Communication loop 
    while(1) 
    { 

     //Send the message to the server 
     if(! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port)) 
     { 
      $errorcode = socket_last_error(); 
      $errormsg = socket_strerror($errorcode); 

      die("Could not send data: [$errorcode] $errormsg \n"); 
     } 

     //Now receive reply from server and print it 
     if(socket_recv ($sock , $reply , 2045 , MSG_WAITALL) === FALSE) 
     { 
      $errorcode = socket_last_error(); 
      $errormsg = socket_strerror($errorcode); 

      die("Could not receive data: [$errorcode] $errormsg \n"); 
     } 

     return $reply; 
    } 
} 
/* 
* chat_join 
* a new user joins the chat 
* @username: String 
* @password: String 
* 
* add a new listener to the server 
* 
*/ 
function chat_join($username = "", $password = "") 
{ 
    $users = array(
     "batman" => "batman123", 
     "robin" => "robin123", 
     "joe" => "joe123" 
    ); 
    if($users[$username] == $password) 
    { 
     return true; 
    } 

    return false; 
} 
function main() 
{ 
    $chat_room_id = array(); 

    $username = stripslashes($_POST['username']); 
    $password = stripslashes($_POST['password']); 
    $action = stripslashes($_POST['action']); 
    $port  = intval($_POST['port']); 
    $domain = stripslashes($_POST['domain']); 
    $chat_id = intval($_POST['chat_room_id']); 

    if(strcmp($action, "login") == 0) 
    { 
     $status = chat_join($username, $password); 
     if($status) 
     { 
      $chat_room_id[] = $chat_id; 
      echo json_encode($status); 
     } 
    } 
    else if(strcmp($action, "chat") == 0) 
    { 
     $msg = stripslashes($_POST['message']); 
     // take the message, send through the client 
     $reply = client($msg); 
     echo json_encode($reply); 
    } 
    else if(strcmp($action, "logout") == 0) 
    { 

    } 
    else 
    { 
     echo json_encode(false); 
    } 
    return; 
} 

main(); 

?> 

La funzione client() è il codice che ho da un file client.php, che quando eseguo sul terminale, è in grado di inviare e ricevere messaggi dallo server.php. Ora vorrei usare il mio file main.php, quindi una volta che l'utente ha effettuato l'accesso invierà messaggi al server, che risponderà ai messaggi che l'utente non ha visto. Quando eseguo server.php e client.php da due terminali diversi, sono in grado di inviare e ricevere messaggi, tuttavia vorrei farlo utilizzando main.php, trasformare il messaggio di risposta in un oggetto JSON e inviarlo alla pagina html dove verrà viene aggiunto a una casella textarea. Il mio problema è: come posso ottenere la risposta che ha ricevuto client.php e rispedirla alla pagina html? Quando eseguire sul terminale, ho:

Enter a message to send : hello 
Reply : hello 

Io uso AJAX per inviare l'input utente nella chat, così ho voluto essere in grado di prendere quel messaggio, e inviarlo al server, che Ho iniziato sul terminale e ho risposto e inoltrato alla pagina web e l'ho aggiunta all'area della casella di testo. Come posso farlo? Devo avviare client.php come servizio tramite main.php? O dovrei usare la funzione client($input) per inviare un messaggio e quindi restituire ciò che invia, indietro? Tuttavia, volevo che client fosse in esecuzione fino a quando l'utilizzo si disconnette, poiché altri client potrebbero connettersi alla chat. Come posso ottenere questo è un po 'sfocato per me. Il codice in client($input) è lo stesso di client.php.

+0

http://stackoverflow.com/questions/2055020/php-chat-client – sdolgy

+0

Inoltre, tenere presente che PHP non è progettato per essere eseguito più di una richiesta. È possibile eseguire più a lungo (ha fatto un bot di chat qualche tempo fa) ma si ha un alto rischio di perdite di memoria e crash se non si è molto molto attenti. Altre lingue potrebbero essere più adatte per le app residenti. – ToBe

risposta

1

Ci scusiamo per l'off-topic, ma se è possibile, sarebbe meglio utilizzare la soluzione pronta XMPP come server ejabberd con il modulo http-bind. Certo, ci sono alcuni contro questa soluzione, ma i contro sono più grandi. Basta guardare in questa soluzione, forse risolverà il tuo problema a basso costo.

vedere related answer with brief desc on XMPP solution

1

Credo di capire cosa sta succedendo. Sembra che potresti perdere un ascoltatore? Di solito i programmi di chat hanno ajax lato client che controlla o "ascolta" i messaggi per un particolare utente a intervalli regolari. Per esempio, se qualcuno ha lasciato un messaggio per l'utente x nel tuo database (o ovunque tu stia memorizzando messaggi), potresti avere qualche javascript che chiama uno script php ogni secondo per vedere se ci sono messaggi sul server per utente x. Se ci sono, è possibile richiamare il messaggio o i messaggi e riceverli tramite la funzione di callback ajax.

Se si ha familiarità con jQuery, controlla il metodo $ .get: http://api.jquery.com/jQuery.get/

1

Come ho capito la tua domanda, si desidera inviare un messaggio dal client al server e non appena questo messaggio arriva al server risponderà a tutti i client ... sono corretto ???

Faccio qualche chat come l'uso di nodejs e altri javascript tecnici ... e devo dire che una grande opzione qui sta usando i socket web. Renditi conto che è browser support is limited, ma dal momento che non hai specificato quali browser devono essere eseguiti, penso che sia un ottimo modo per farlo.

controllare questo link correlati:

How to Use Sockets in JavaScript\HTML?

http://socket.io/

Un possibile modo di fare che solo con PHP + js è fare qualche funzione e mettere in un setInterval per fare richiesta al server ogni 12 secondi. Ho fatto una specie di chat asp nel 2005 che usa questo approccio. E devo dire che la presa sul web è molto meglio.

Non so se questo risponde alla tua domanda ... fammi sapere!

+1

Il supporto Websocket è in realtà universale in tutti i browser desktop correnti e node.js ha fallback sufficienti in modo che funzioni su tutti i browser da IE5.5. –

1

Ho sviluppato qualcosa seguendo queste linee prima di utilizzare PHP e jQuery. La soluzione che ho scelto è dovuta alle restrizioni sulla configurazione del server (fuori dal mio controllo). Ho usato uno script core PHP per creare l'intero layout della pagina dalla finestra del messaggio alla casella di invio del messaggio. Ad ogni utente che è arrivato alla pagina è stato assegnato un utente generato a caso come utente 123234234 generato da un timestamp unix dal momento in cui sono entrati nella pagina di chat.

Tutti i messaggi inviati sono stati archiviati in un file XML e un nuovo file XMl è stato creato giornalmente. L'utente è stato tenuto in un nodo di messaggi come di seguito con i dettagli dell'utente per ogni messaggio che utilizza attributi di nodo diversi.

La finestra del messaggio è stata aggiornata ogni 5 secondi utilizzando la chiamata AJAX jquery a un altro script PHP che leggeva nell'XML che giorni il file XML solo dal momento in cui l'utente ha inserito la pagina di chat.

<messages> 
    <message user="user123456" ip="127.0.0.1" session="{users session ID here}" time="{unix timestamp}"><![CDATA[User message here]]></message> 
</messages> 

C'è molta più logica dietro di esso, ma ho trovato il più facile da sviluppare e mantenere, spero che aiutare a punto nella giusta direzione. E funziona su tutti i principali browser e da IE7 +.

Problemi correlati