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
.
http://stackoverflow.com/questions/2055020/php-chat-client – sdolgy
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