Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Serwer TCP pod PHP
sasiadstar
post 17.07.2018, 12:05:08
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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ąć

Ten post edytował sasiadstar 17.07.2018, 12:05:50
Go to the top of the page
+Quote Post
Pyton_000
post 17.07.2018, 12:36:41
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pokaż jak kombinowałeś
Go to the top of the page
+Quote Post
sasiadstar
post 21.07.2018, 07:59:33
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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

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

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]


Ten post edytował sasiadstar 21.07.2018, 08:22:23
Go to the top of the page
+Quote Post
markuz
post 21.07.2018, 14:42:41
Post #4





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


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


--------------------
Go to the top of the page
+Quote Post
session
post 23.07.2018, 05:18:09
Post #5





Grupa: Zarejestrowani
Postów: 112
Pomógł: 22
Dołączył: 11.04.2010
Skąd: Tarnów

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


Możesz sprawdzić, czy sockety są włączone na hostingu:
  1. echo (extension_loaded('sockets')) ? 'true' : 'false'


I upewnić się, że hosting domyślnie nie blokuje wyświetlania błędów/włączyć ich wyświetlanie.

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.

Ten post edytował session 23.07.2018, 05:54:47
Go to the top of the page
+Quote Post
sasiadstar
post 23.07.2018, 06:09:36
Post #6





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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.
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: 29.03.2024 - 03:20