Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> protokół komunikacyjny w php
Jabol
post 5.05.2003, 19:57:00
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Seth
post 5.05.2003, 20:12:57
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Jabol
post 6.05.2003, 13:26:54
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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ć!
Go to the top of the page
+Quote Post
Seth
post 6.05.2003, 13:54:59
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Jabol
post 6.05.2003, 14:00:13
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
DeyV
post 6.05.2003, 14:08:54
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Jabol
post 6.05.2003, 16:25:33
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
dragossani
post 6.05.2003, 16:56:42
Post #8





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.


--------------------
cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
Go to the top of the page
+Quote Post
Jabol
post 6.05.2003, 17:19:57
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
melon
post 5.06.2003, 12:21:28
Post #10





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 25.03.2003

Ostrzeżenie: (0%)
-----


Witam!

Zobaczcie Nanoweb HTTP server, wyrzezbiony w php:

http://nanoweb.si.kz/


--------------------
<?print(base64_decode("QWxsIHlvciBiYXNlIGFyZSBiZWxvbmcgdG8gdXMh"));?>
Go to the top of the page
+Quote Post
melon
post 6.06.2003, 08:22:50
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 25.03.2003

Ostrzeżenie: (0%)
-----


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...


--------------------
<?print(base64_decode("QWxsIHlvciBiYXNlIGFyZSBiZWxvbmcgdG8gdXMh"));?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.06.2024 - 06:31