Serwer (Wywoływany jako "php -q serwer.php"):
<?php
dl(\"php_sockets.dll\");
$address = '192.168.0.1';
$port = 522;
print 'Uruchamianie serwera';
if (($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
echo \"nnsocket_create() failed: reason: \" . socket_strerror ($sock) . \"n\"; else print '.';
if (($ret = socket_bind($sock, $address, $port)) < 0)
echo \"nnsocket_bind() failed: reason: \" . socket_strerror($ret) . \"n\"; else print '.';
if (($ret = socket_listen($sock, 5)) < 0)
echo \"nnsocket_listen() failed: reason: \" . socket_strerror($ret) . \"n\"; else print '.';
do{
if (($msgsock = socket_accept($sock)) < 0)
{
echo \"nnsocket_accept() failed: reason: \" . socket_strerror($msgsock) . \"n\"; break;
}
$msg = \"nWelcome to the KAB php Test Server. n\";
socket_write
($msgsock, $msg, strlen($msg)); print \"tUser connected\";
do{
if (FALSE === ($buf = socket_read ($msgsock, 4096, PHP_NORMAL_READ)))
{
echo \"socket_read() failed: reason: \" . socket_strerror($ret) . \"n\"; break 2;
}
{
continue;
}
if ($buf == 'quit')
{
break;
}
if ($buf == 'get')
{
print \"nttWysylanie 'file'...n\"; $message = 'file';
socket_write
($msgsock, $message, strlen($message)); if(!(FALSE === ($b = socket_read ($msgsock, 4096, PHP_NORMAL_READ))))
{
$message = 'ok';
socket_write
($msgsock, $message, strlen($message)); $f = fopen(\"./\" . $b, \"wb\"); print \"ttTransfering data\"; while(!(FALSE === ($b = socket_read ($msgsock, 10240, PHP_NORMAL_READ))))
{
if($b != \"end\")
{
}else{
print \"nttOtrzymano 'end'...n\"; break 2;
}
}
}else{
}
}
if ($buf == 'shutdown')
{
$quit_message = 'Dziękujemy za skorzystanie z naszych usług';
socket_write
($msgsock, $quit_message, strlen($quit_message)); socket_close($msgsock);
print 'Zatrzymywanie serwera'; break 2;
}
$talkback = \"> '$buf'.n\";
socket_write
($msgsock, $talkback, strlen($talkback)); }while(true);
print \"tUzytkownik rozlaczonynn\"; print \"Oczekiwanie na nastepne polaczenien\"; socket_close ($msgsock);
}while(true);
socket_close ($sock);
?>
Klient (przez www):
<PRE><?php
$plik = \"do_przeslania.zip\";
$sciezka = \"./\";
$s = fsockopen('192.168.0.1', 522
, $error, $errno, 10
); if(fread($s, 2048) == \"file\") {
if(fread($s, 2048) == \"ok\") {
$fp = fopen($sciezka . $plik, \"rb\"); {
}
}else{
}
}else{
}
?></PRE>
Klient wysyła zawartość pliku odczytanego z dysku na serwer.
Serwer jest jednowątkowy piki co, ale jak na pierwsze moje dzieło z użyciem socket_* to chyba nieźle...
Byłbym wdzięczny za poprawki do tego wspaniałego (moim skromym zdaniem) serwera...
Klient będzie docelowo napisany w php-GTK, tak by odczytywać pliki z dysków użytkowników...
Celem jest stworzenie uploadera w php-GTK (klient) i php (serwer).
Klient tutaj zamieszczony jest (jak już wspomniałem) dla potrzeb testów...
Najbardziej liczę na waszą pomoc jeżeli chodzi o dodanie wielowątkowości do serwera - tak by naraz z niego mogło korzystać wiele osób.
Jeżeli okaże się to niemożliwe, to proszę o podpowiedź w jaki sposób można "zablokować" serwer przed kolejnymi uploadami (tak, by klient wiedziałm że serwer jest wykorzystywany przez kogoś innego i musi poczkać)
<b>Właśnie - najważniejsza sprawa - serwer jest pod windowsa!</b>
Nie mam zielonego pojęcia, czy i w jaki sposób będzie działał pod linuxem...
UpDated: malutki bug w kliencie - nazwy zmiennychUpDated: dodanie "if mod loaded = false"... Uaktualniłem BBCode do wersji z IPB...(IMG:
http://forum.php.pl/style_emoticons/default/winksmiley.jpg)