2012-12-16 11 views
8

Próbuję utworzyć PHP czat, więc mam server.php który uruchamia serwer na terminalu, który jest słuchać client połączeń:Tworzenie klienta na pogawędkę w 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(); 

?> 

funkcji client() jest kod, który mam z pliku client.php, który po uruchomieniu na terminalu jest w stanie wysyłać i odbierać wiadomości od server.php. Teraz chciałbym użyć mojego pliku main.php, więc gdy użytkownik zostanie zalogowany, wyśle ​​wiadomości na serwer, który odpowie na te wiadomości, których użytkownik nie widział. Po uruchomieniu server.php i client.php z dwóch różnych terminali, jestem w stanie wysyłać i odbierać wiadomości, jednak chciałbym to zrobić przy użyciu main.php, przekształcić tę wiadomość odpowiedzi na obiekt JSON i wysłać z powrotem na stronę html, gdzie będzie dołączone do pola textarea. Mój problem: jak mogę uzyskać odpowiedź, którą otrzymał client.php i odesłać ją na stronę html? Kiedy wykonać go na terminalu, mam:

Enter a message to send : hello 
Reply : hello 

używam AJAX aby wysłać dane wprowadzone przez użytkownika w czacie, więc chciałem być w stanie podjąć tę wiadomość i wysłać go do serwera, który Zacząłem od terminala i odbierałem odpowiedź z powrotem na stronę i dołączałem ją do pola tekstowego. Jak mogę to zrobić? Czy powinienem rozpocząć client.php jako usługę przez main.php? A może powinienem użyć funkcji client($input), aby wysłać wiadomość, a następnie zwrócić to, co ona wysyła, z powrotem? Jednak chciałem, aby ta client była uruchomiona do czasu wylogowania się, ponieważ inni klienci mogą łączyć się z czatem. Jak mogę to zrobić, jest dla mnie trochę niewyraźne. Kod w client($input) jest taki sam jak w client.php.

+0

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

+0

Należy również pamiętać, że PHP nie jest zaprojektowane do uruchamiania dłużej niż jedno żądanie. Czy może działać dłużej (zrobił chat chat jakiś czas temu), ale istnieje duże ryzyko wycieku pamięci i awarii, jeśli nie jesteś bardzo ostrożny. Inne języki mogą być bardziej odpowiednie dla aplikacji rezydentnych. – ToBe

Odpowiedz

1

Przepraszamy za nietypowy temat, ale jeśli to możliwe, lepiej będzie użyć gotowego rozwiązania XMPP, takiego jak serwer ejabberd z modułem powiązania http. Oczywiście, jest kilka wad, takie rozwiązanie, ale wady są większe. Po prostu spójrz w to rozwiązanie, może to rozwiąże Twój problem przy niskich kosztach.

zobaczyć related answer with brief desc on XMPP solution

1

Chyba rozumiem, co się dzieje. Wygląda na to, że może ci zabraknąć słuchacza? Zazwyczaj programy czatowe mają ajax po stronie klienta, który sprawdza lub "nasłuchuje" wiadomości dla określonego użytkownika w regularnych odstępach czasu.

Na przykład, jeśli ktoś zostawił wiadomość dla użytkownika x w bazie danych (lub w dowolnym miejscu, w którym przechowujesz wiadomości), możesz mieć trochę javascriptu, który wywołuje skrypt php co sekundę, aby sprawdzić, czy są jakieś wiadomości na serwer dla użytkownika x. Jeśli tak, możesz ponownie odebrać wiadomość lub wiadomości i odebrać je za pomocą funkcji ajax callback.

Jeśli jesteś zaznajomiony z jQuery, sprawdź metodę $ .get: http://api.jquery.com/jQuery.get/

1

jak rozumiem Twoje pytanie, chcesz wysłać wiadomość od klienta do serwera i jak tylko dostanie tę wiadomość na serwerze odpowie wszystkim klientom ... mam rację ???

Wykonuję czat, jak używanie nodejów i innych technologii javascripts ... i muszę powiedzieć, że świetną opcją jest używanie gniazd internetowych. Zdaj sobie sprawę, że browser support is limited, ale skoro nie określiłeś, jakie przeglądarki muszą uruchomić to, myślę, że to świetna droga.

sprawdzić ten Powiązane linki:

How to Use Sockets in JavaScript\HTML?

http://socket.io/

Możliwym sposobem to robić tylko za pomocą php + js to zrobić jakąś funkcję i umieścić w setInterval aby żądanie do serwera za każdym 12 sekund. W 2005 roku zrobiłem coś w rodzaju czatu, który wykorzystuje to podejście. I muszę powiedzieć, że gniazdo internetowe jest znacznie lepsze.

Nie wiem, czy to odpowie na twoje pytanie ... daj mi znać!

+1

Obsługa Websocket jest rzeczywiście uniwersalna we wszystkich obecnych przeglądarkach komputerowych, a node.js ma wystarczające awarie, dzięki czemu działa we wszystkich przeglądarkach od IE5.5. –

1

Opracowałem coś podobnego, zanim użyję PHP i jQuery. Rozwiązanie, do którego dążyłem, wynikało z ograniczeń konfiguracji serwera (z mojej kontroli). Użyłem skryptu rdzeniowego PHP do stworzenia całego układu strony z okna wiadomości do okna przesyłania wiadomości. Każdy użytkownik, który wszedł na tę stronę, otrzymał losowo wygenerowany użytkownik, taki jak user123234234, wygenerowany poza znacznikiem czasu unix od chwili, gdy wszedł na stronę czatu.

Wszystkie przesłane wiadomości zostały zapisane w pliku XML i codziennie tworzony był nowy plik XMl. Użytkownik był przechowywany w węźle komunikacyjnym, jak poniżej, ze szczegółami użytkownika dla każdej wiadomości używającej różnych atrybutów węzła.

Okno wiadomości było odświeżane co 5 sekund za pomocą wywołania AJAX jquery do innego skryptu PHP, który wczytał w XML plik XML tylko od momentu, w którym użytkownik wszedł na stronę czatu.

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

Jest dużo bardziej logiczny za nim, ale uważam, że jest to najłatwiejszy do rozwoju i utrzymania, mam nadzieję, że to pomoże punkt w dobrym kierunku. Działa na wszystkich głównych przeglądarkach i na IE7 +.