Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: protokół komunikacyjny w php
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
Jabol
Ostatnio udzielałem odpowiedzi w poście i tknęło mnie, że można zrobić coś bardzo ciekawego. Mam na myśli protokół komunikacyjny w php, za pomocą fsocketopen, print i fgets na kliencie oraz readline oraz print na serwerze? Czy tak by się dało. Do zastosowań mniejszych lub nawet większych. Wszystko można by tak było zrobić (nawet serwer www, ale po co wyważać otwarte drzwi). Mam na myśli coś takiego.
  1. <?php
  2. #klient:
  3. $serw=fsockopen($host, $serwer);
  4. #serwer:
  5. print &#092;"HELLO I AM php BASED WEB SERWERnLOGINnREADYn\";
  6. $user=readline();
  7. #klient:
  8. while(($komenda=fgets($serw, dlugosc/*nie znam defaultowej*/))!=&#092;"LOGIN\"){
  9. do_kommand($komenda);
  10. }
  11. while(($komenda=fgets($serw, dlugosc/*nie znam defaultowej*/))!=&#092;"READY\"){
  12. //czekaj na ready
  13. }
  14. fputs($serw, 'TEST');
  15. #serwer:
  16. print &#092;"PASSnREADYn\";
  17. $pass=readline();
  18. #klient:
  19. while(($komenda=fgets($serw, dlugosc/*nie znam defaultowej*/))!=&#092;"PASS\"){
  20. //czekaj na pass
  21. }
  22. while(($komenda=fgets($serw, dlugosc/*nie znam defaultowej*/))!=&#092;"READY\"){
  23. //czekaj na ready
  24. }
  25. fputs($serw, 'TEST_PASS');
  26. #server:
  27. if(test_auth($user, $pass)){
  28. print &#092;"LOGIN CORRECTnREADY\";
  29. }
  30. else{
  31. print &#092;"LOGIN INCORRECTnSERVER IS GOING DOWNn\";
  32. die('BYE');
  33. };
  34. $kommand=readline();
  35. #klient:
  36. if(fgets($serw='LOGIN CORRECT')){
  37. while(($komenda=fgets($serw, dlugosc/*nie znam defaultowej*/))!=&#092;"READY\"){
  38. //czekaj na ready
  39. }
  40. print 'LOGGOUTnEXITn';
  41. }
  42. ?>

Mam pytanie czy coś takiego wogóle by działało (oczywiście by się dało w linuxie odpowiednią konfigurację, wiem, że tak sie da). Tak co do możliwości to uważam, że są spore aczkolwiek niewydajne i myśle, ze lepiej to napisać w czym innym, ale tak się po prostu zastanawiam...
Napiszcie co o tym myślicie i czy macie już może tego typu doświadczenia?
Seth
Przenioslem topic do php Pro gdyz moze to byc niezly temat do dyskusji.

Tylko szczerze mowiac nie zabardzo wiem co Ci chodzi. Czy mogl bys jasniej przedstawic projekt ?
Jabol
Cytat
Przenioslem topic do php Pro
hehe, a ja go szukam
Cytat
Czy mogl bys jasniej przedstawic projekt
Są dwie strony (jak zawsze w sieci). Jedna jest serwerem, a raczej skryptem serwera napisanym w php i uruchamianym pod linuxem za pomocą plików (a raczej wpisanych do nich danych)
Kod
/etc/services

---------------

phpserwer 12345/tcp



/etc/inetd.conf

-----------------

phpserwer stream tcp nowait user /home/user/skrypt.php

Skrypt musiałby miec taką postać
  1. #!/usr/bin/php -args
  2. <?php
  3. //kod programu
  4. ?>
Teraz dochodzi klient, który może być czymkolwiem, skryptem www, skryptem shellowym, lub nawet programem w c/czymkolwiem.
Polega to na tym, że skrypt po stronie klienta miałby otwierałby połączenia za pomocą fsockopen((local)host, 12345). Port podałem taki, żeby się zgadzało z plikem konfiguracyjnym. Teraz tak. Skrypt funkcją fputs() wydawał by polecenia/odpowiadałby serwerowi, a funckją fgets otczytywałby odpowiedzi/polecenia serwera. Inaczej by to jednak musiało wyglądać po stronie serwera, który musiałby jakoś odczytywać dane (komunikowałby sie za pomocą print, więc z tym podejrzewam nie ma problemu). Myślę, że dałoby się to zrobić np. za pomocą readline, tylko czy to by działało w takim zastosowaniu. W przykładzie na górze, w tym dialogu pomiędzy serwerem a klientem użyłem pewnego zabezpieczenia. Klient nie wysyłałby danych dopóki nie otrzymałby od serwera instrukcji READY (print "READYn"; na serwerze). To oznaczałoby, że serwer gotowy jest do otrzymania odpowiedzi/instrukcji. Mam nadzieję, że teraz już to jaśniej wyjaśniłem i jakoś można się w tym połapać!
Seth
No jakos mozna winksmiley.jpg

Tylko zastanawiam sie po co chcesz cos takiego zrobic ?

Cos takiego mozna osiagnac np w polaczeniu z Flashem. Na kliencie odpalamy Flasha, ktory np jest chatem. Laczy sie on do strony przekazujac jej dane. Strona odpowiada mu itd.

Jednak wg. mnie lepszym rozwiazaniem jest Java, ktora jest min. do tego przeznaczona.
Jabol
wiem, tylko, że ja nie znam javy. Wprawdzie mam u siebie pare książek o javie ale na rozdziale 3 wysiadam. a php znam więc jest to dla mnie kwestią napisać coś, a nie nauczyć się języka od początku (żeby poznać jave tak jak php musiałbym się uczyć ze 4 miesiące) i dopiero potem coś napisać! a php jest bardzo dobrym narzędziem z wbudowaną obsługą wielu standartów, co mi bardzo odpowiada! A ten pomysł to tak tylko z czystej ciekawości i troche z nóduw, a nie chce mi się pisac kolejnej jeszcze lepszej księgi gości (php to tylko moje hobby i sam wymyślam sobie zadania).
DeyV
Jak chcesz, to ci parę wymyślimy, Jestem pewien, że pracy jest wiecej, niż chętnych do jej wykonania.
Jeśli jednak masz watpliwości, czy sięgnąc po Jave, warto zajrzeć do odświerzonego własnie topicu dragossaniego na ten temat na hydeparku
Jabol
a co powiecie na najprostszą implementacje? Niestety nie jest przetestowana, bo mój mandrake nie posiada pliku inetd.conf. Ale chyba to zostawie, bo zdaje się, że w końcu będzie można się zająć php.pl.
ale wracając do kodu!
KLIENT:
  1. #!/usr/bin/php
  2. <?php
  3. function wait_ready($s){
  4. while(trim(fgets($s, 4096))!==&#092;"READY\"){
  5. //do nothing
  6. }
  7. return;
  8. }
  9.  
  10. function get_message($s, $message_name){
  11. while(($c=trim(fgets($s, 4096)))!==&#092;"END OF $\".$message_name.\"$\"){
  12. $return.=$c.&#092;"n\";
  13. }
  14. return $return;
  15. }
  16.  
  17. function parse_command($s, $command){
  18. $c=explode(&#092;" \", $command);
  19. switch ($c[0]]){
  20. case &#092;"MESSAGE\":
  21. $mn=str_replace(&#092;"$\", \"\", $c[1]]);
  22. return get_message($s, $mn);
  23. break;
  24. }
  25. }
  26.  
  27. $s=fsockopen(&#092;"localhost\", 12345);
  28. if(trim($sp=fgets($s, 4096))===&#092;"XPS\"){
  29. print &#092;"CONNECTED CORRECTLY!\";
  30. };
  31. while(trim($sp=fgets($s, 4096))!==&#092;"LOGIN\"){
  32. print &#092;"SERVER: \".$sp;
  33. }
  34. wait_ready($s);
  35. print &#092;"TEST\";
  36. while(trim($sp=fgets($s, 4096))!==&#092;"PASSWORD\"){
  37. print &#092;"SERVER: \".$sp;
  38. }
  39. wait_ready($s);
  40. print &#092;"TEST\";
  41.  
  42. while(($c=trim(fgets($s, 4096)))!==&#092;"DISCONNECT\"){
  43. print parse_command($s, $c);
  44. }
  45.  
  46. print &#092;"END OF CONNECTION\";
  47. ?>[/php:1:19da91d309]SERWER:[php:1:19da91d309]#!/usr/bin/php
  48. <?php
  49.  
  50. define(&#092;"VERSION\", 0.1);
  51. define(&#092;"XPSDOCROOT\", dirname(__FILE__));
  52. define(&#092;"READY\", \"READY\");
  53.  
  54. function xps_gets(){
  55. print READY.&#092;"n\";
  56. return readline();
  57. }
  58.  
  59. function xps_login($user, $pass){
  60. $auth[&#092;"TEST\"]=\"TEST\";
  61. if($auth[$user]===$pass){
  62. $GLOBALS[&#092;"logged\"]=true;
  63. return true;
  64. }
  65. else{
  66. $GLOBALS[&#092;"logged\"]=false;
  67. return false;
  68. };
  69. }
  70.  
  71. function xps_logout($exit){
  72. $GLOBALS[&#092;"logged\"]=false;
  73. if($exit==true){
  74. xps_exit()
  75. }
  76. return true;
  77.  
  78. }
  79.  
  80. function xps_exit(){
  81. print &#092;"SERVER IS GOING DOWN\";
  82. die(&#092;"nBYEn\");
  83. }
  84.  
  85. print &#092;"XPSnHELLOnLOGINn\";
  86. $user=xps_gets();
  87. if(empty($user)){
  88. print &#092;"ERRORnUSER EMPTYn\";
  89. xps_exit();
  90. };
  91. print &#092;"GOTnPASSWORDn\";
  92. $pass=xps_gets();
  93. if(empty($pass)){
  94. print &#092;"ERRORnPASS EMPTYn\";
  95. xps_exit();
  96. };
  97. print &#092;"GOTn\";
  98. if(!xps_login($user, $pass)){
  99. print &#092;"ERRORnLOGIN FAILEDn\";
  100. xps_exit();
  101. };
  102. print &#092;"MESSAGE $HELLO$n\";
  103. print &#092;"This is XPS- eXtamblished php-based Server!n\";
  104. print &#092;"It's only the test version, so I've got to disconnect!n\";
  105. print &#092;"END OF $HELLO$n\";
  106. print &#092;"DISCONNECTn\";
  107. xps_logout();
  108. xps_exit();
  109. ?>

To było na tyle, może kogoś to zainteresuje i to skończy, a może ja to kiedyś skończe... (chociaż jak już robić coś takiego, to, racja, nie w php)
dragossani
W Mandrake'u jest xinetd o ile się orientuję. Co do serwerów http napisanych w php, to jest już coś takiego (był na ten temat post na forum) - trzeba być nieco nawiedzonym, żeby brać się za coś takiego :wink:. Sam pomysł ustawienia skryptu php bezpośrednio na porcie jest niezły i mógłby się sprawdzić na przykład jako element podnoszenia bezpieczeństwa jakiegoś bardziej złożonego systemu. Zastanawiam się właśnie nad zastosowaniami. Jak coś wymyślę to napiszę.

Jedno skojarzenie: jak to się ma do SOAP i XML-RPC?
Drugie skojarzenie: WDDX jako format przesyłu zmiennych przez taki port.
Jabol
ale niestety nie rozumiem (jakieś opcje zmienione/dodane/odjęte) sposobu konfiguracji tego pliku (wiem tylko, że trzeba stworzyć plik w /etc/xinetd podobny strukturą do innych). Co do SOAP i jemu podobnych, mysle, że jest jest to chyba naprawde jedno z lepszych zastosowań tego dla czegoś takiego. Ale można to też użyc np. w przypadkach gdy trzeba odwołać się do innej warstwy, mam na myśli nie w skrypcie, np. podczas logowania (żeby nie można było zrobić $logged=true; zamiast try_to_login(nieznane, skryptowi, dane), taki mały konik trojański).
melon
Witam!

Zobaczcie Nanoweb HTTP server, wyrzezbiony w php:

http://nanoweb.si.kz/
melon
Taki protokol komunikacyjny to calkiem niezla rzecz, probuje to jakos rozwinac na swoje potrzeby i wrzuce kod. Mi chodzi raczej o to, aby skrypt www polaczyl sie ze zdalnym serwerem php, zidentyfikowal sie i pobral jakies zmienne albo dane z bazy. Nie wiem jeszcze po co, ale na pewno sie przyda ;-)) Pozdrawiam...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.