Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ Serwer TCP pod PHP

Napisany przez: sasiadstar 17.07.2018, 12:05:08

Witam serdecznie

Mam urządzenie które ma za zadanie przesłać dane na serwer w formie tekstowej(kilkadziesiąt bajtów jednorazowo).

Dane przekazywane są po TCP
Próbuję to jakoś ogarnąć w PHP ale kombinuję już od jakiegoś czasu i nie bardzo wiem jak się do tematu zabrać.

Do celów testowych uruchomiłem serwer pod node wszystko działa tak jak powinno ale z PHP jakoś nie mogę tego ogarnąć.
Prosiłbym o podpowiedz od czego zacząć

Napisany przez: Pyton_000 17.07.2018, 12:36:41

Pokaż jak kombinowałeś

Napisany przez: sasiadstar 21.07.2018, 07:59:33

Wracam do tematu
Wszystko co poniżej działa ale tylko na lokalu, niestety na serwerze hostingowym już niestety nie

  1. <?php
  2. http://www.php.net/echo "OK";
  3.  
  4. /*************************************/
  5. /********Socket Server*********************/
  6. http://www.php.net/set_time_limit (0);
  7. // Set the ip and port we will listen on
  8. $address = '127.0.0.1';
  9. $port = 3000;
  10. // Create a TCP Stream socket
  11. $sock = socket_create(AF_INET, SOCK_STREAM, 0); // 0 for SQL_TCP
  12. // Bind the socket to an address/port
  13. socket_bind($sock, 0, $port) or http://www.php.net/die('Could not bind to address'); //0 for localhost
  14. // Start listening for connections
  15. socket_listen($sock);
  16. //loop and listen
  17. while (true) {
  18. /* Accept incoming requests and handle them as child processes */
  19. $client = socket_accept($sock);
  20. // Read the input from the client ? 1024000 bytes
  21. $input = socket_read($client, 1024000);
  22. // Strip all white spaces from input
  23. http://www.php.net/echo $input;
  24. http://www.php.net/flush();
  25. http://www.php.net/ob_flush();
  26. http://www.php.net/sleep(1);
  27.  
  28.  
  29.  
  30.  
  31.  
  32. // Close the master sockets
  33. }
  34. socket_close($sock);
  35.  
  36.  
  37. ?>

Te flusze to tylko po to żebym mógł z przeglądarki odpalać

Client w node
[JAVASCRIPT] pobierz, plaintext
  1. var net = require('net');
  2. function loop(){
  3. var client = new net.Socket();
  4. client.connect(3000, 'xxx', function() {
  5. console.log('Connected');
  6. client.write('CZESC.');
  7. });
  8.  
  9. client.on('data', function(data) {
  10. console.log('ODEBRANO: ' + data);
  11. client.destroy(); // kill client after server's response
  12. });
  13.  
  14. client.on('close', function() {
  15. console.log('Connection closed');
  16. });
  17. }
  18. setInterval(loop,3000);
[JAVASCRIPT] pobierz, plaintext


Nie wiem czy porty są po blokowane na serwerze i nie ma do nich dostępu czy co?
Czy można ten temat jakoś podejść jakoś inaczej np po zwykłym www port 80 tak żeby serwer tylko odebrał paczkę mimo że brak poprawnego nagłówka i np zapisał do pliku.


P.S Próbowałem też dodać takie coś w htaccess (pewnie coś tu żle napisane jest)
  1. Options +FollowSymLinks -MultiViews
  2. # Turn mod_rewrite on
  3. RewriteEngine On
  4. RewriteBase /
  5.  
  6. RewriteCond %{HTTP_HOST} ^xxx.pl$ [NC]
  7. RewriteCond %{HTTPS} off
  8. RewriteRule ^xxx:3000%{REQUEST_URI} [P,QSA,L]

Napisany przez: markuz 21.07.2018, 14:42:41

Co to za hosting? Jeżeli się nie mylę, to większość hostingów PHP nie pozwala na użycie serwera socket - ich zasada działania jest inna niż zwykłej strony www po HTTP (na porcie 80). Na VPS na pewno dasz radę to postawić.

Napisany przez: session 23.07.2018, 05:18:09

Możesz sprawdzić, czy sockety są włączone na hostingu:

  1. http://www.php.net/echo (http://www.php.net/extension_loaded('sockets')) ? 'true' : 'false'


I upewnić się, że hosting domyślnie nie blokuje wyświetlania błędów/https://stackoverflow.com/a/21429652.

Na hostingach raczej wszystkie porty poza standardowymi usługami są zablokowane, więc to też nie przejdzie.

Do komunikacji klienta z serwerem możesz również stworzyć proste REST API (po stronie serwera), użyć kodów odpowiedzi HTTP i do tego jakieś uwierzytelnianie. Łatwo znaleźć kilka tutoriali/gotowców do PHP REST API. Klientem wysyłasz dane na konkretny URL.

Cytat
Czy można ten temat jakoś podejść jakoś inaczej np po zwykłym www port 80 tak żeby serwer tylko odebrał paczkę mimo że brak poprawnego nagłówka i np zapisał do pliku.

Brak właściwego nagłówka spowoduje, że nie zostanie to odebrane (tym bardziej na hostingu gdzie nie ma dostępu do pełnej konfiguracji). Możesz albo w sieci urządzenia generującego dane dodać osobny serwer, który będzie lokalnie odbierał samo TCP i potem wysyłał na serwer hostingowy HTTP, albo sprawdzić czy samo urządzenie/moduł sieciowy (ethernet/wifi) nie ma biblioteki do HTTP. Inaczej to tylko jakiś VPS ze swoim IP, dobrze skonfigurowany.

Napisany przez: sasiadstar 23.07.2018, 06:09:36

Macie koledzy rację że to nie przejdzie, zostałem zmylony przez BOK że powinno działać dopiero ktoś inny zajął się sprawą i dopytał o jaki konkretnie typ danych jest dostarczany i mnie uświadomił że tak się nie da. (na wstępie rozmowy zaznaczałem im o co mi chodzi!!!)

Ale odblokowali dla mnie jeden port pod ten skrypt i .... niby "trochę" działa a trochę nie a trochę robi różnię.

Jeżeli odpalę klienta wszystko jest OK, śmiga aż milo ale jak zapodam transmisje z tego urządzenia to tylko raz przyjdą dane i na tym się kończy. Czas pomiędzy kolejną porcją danych to 30 sekund i tu pewnie jest problem, zauważyłem że jak odpalę skrypt i to urządzenie to wszystko działa i pomiędzy danymi ze skryptu klienta przewijają się paczki z tego urządzenia, a jak samo device to jest jedna wielka kupa.

"Zrobiłem" też skrypt w Node bo może... a nóż... niestety klient wywala jakiś exception i na tym się zabawa kończy, więc pozostanę przy PHP.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)