Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Komunikacja Server -> Client z poziomu PHP
Forum PHP.pl > Forum > PHP
adbacz
Czy posiadając tylko i wyłącznie adres IP komputera klienckiego, jestem w stanie wysłać mu, z poziomu PHP wysłać żądanie do tego komputera?

Czy może jest jakiś inny sposób (bibioteka), która da mi taką możliwość?
Oczywiście zakładając, że wiem, z jakim komputerem chcę sie połączyć.
ohm
Jakiego typu żądanie? bezpośrednie Tcp? czy może websocket?
Crozin
@ohm: WebSocket działa na TCP.
@adbacz: Oczywiście, że jesteś wstanie wysłać dowolne dane na dowolny adres. Tylko podaj jakieś konkretne pytanie/zagadnienie...
fate
Jeżeli dobrze Cie zrozumiałem to nie, kod php musi byc przemielony przez serwer php
Snorkle.gif
adbacz
Ktoś coś zrobił, i potrzebuję poinformować o tym zdarzeniu dany komputer. Nie mam zielonego pojęcia co do tego użyć, prosiłbym tylko o jakieś wskazówki, co można użyć i w jakim stopniu a dalej sobie doczytam.
fate
zaciekawil mnie ten problem do zwyklego komunikatu jest NET SEND ale dziala na xp a ja roumiem ez ty najchetniej bys wyslal mu trojana przez php baaasmiley.gif
jestes pewny ze winowajca nie ma zmiennego IP co_jest.gif
Znalazlem tez kilka sposobow na wyslanie danych ale w innych jezykach niz php, ale nie "żądania"
adbacz
Spokojnie, ten "komputer" to jest mój komputer i nie jest żadnym winowajcą wink.gif

System to XP na tym komputerze. Chodzi o to, żebym poinformował ten komputer z poziomu serwera, bez względu na to, czy ja wyślę mu te dane, które chce by dostał, czy wyśle my tylko "coś" a program na komputerze pobierze sobie sam te dane z serwera. Chodzi mi tylko o jakiekolwiek poinformowanie komputera klienckiego o tym, że coś się stało, resztę sobie jakoś ogarnę.
Crozin
Czy to ma działać na poziomie przeglądarki (HTTP) czy na poziomie systemów operacyjnych?
adbacz
@crozin - Ale "to" czyli co?

Jesli to coś, co ma informować komputer, to na poziomie serwera (PHP). Ktoś coś będzie robił na stronie internetowej, i jeśli ten ktoś zrobi określoną czynność to z poziomu PHP muszę wysłać do komputera info, że to coś zostało zrobione. Czy to będzie zwykłe "Hey! Sprawdź, bo ktoś coś zrobił!", czy "Masz tutaj dane, kto i co zrobił..." to jest to bez różnicy. Muszę tylko wysłać lub połączyć się z komputerem z PHP na serwerze.
Crozin
Nie pytam o treść wiadomości tylko o sposób jej przesłania. Czy ona ma trafić do przeglądarki innej osoby (na innym komputerze) czy do jakiejś innej aplikacji (dedykowanej) na tymże kompuetrze?
adbacz
Aha, nie zrozumiałem co ma na myśli. Ma trafić do dedykowanego programu na tym komputerze.
Crozin
Albo http://php.net/manual/en/sockets.examples.php albo http://php.net/manual/en/function.fsockopen.php - chociaż poszukałbym jakieś wysokopoziomowej biblioteki do połączeń.
adbacz
Dzięki za linki, poczytam i spróbuje coś zdziałać.

[cite]...chociaż poszukałbym jakieś wysokopoziomowej biblioteki do połączeń[/cite]
Hmm... jak mam zapytać o to Google... ;/
misiek172
jeżeli wiesz jaki komputer ma zostać poinformowany to zamiast jemu wysyłać powiadomienia to ustaw, żeby on sprawdzał co jakiś czas czy nie ma dla niego powiadomienia na serwerze

w drugą stronę to i tak to samo, bo komputer musi zostać przygotowany na odebranie tego komunikatu, więc co za różnica czy przygotujemy serwer czy komputer?
Crozin
@misiek172: Różnica jest taka, że klient nie musi wtedy bezsensownie "katować" serwera zapytaniami o nowe rzeczy i w dodatku powiadomienie pojawia się natychmiast.
adbacz
@misiek172 - Stąd też to zapytanie właśnie. Na początku tak właśnie chciałem zrobić, by komputer odpytywał serwer, lecz stwierdziłem, że to zabije w końcu serwer i zaczałem mysleć nad tym, by to komputer był w tym momencie informowany.
Crozin
@adbacz: A tak z czystej ciekawości... mógłbyś podać nieco więcej informacji n/t tego co dokładnie ma być przesyłane? Tj. jaki rodzaj informacji, w jakim kontekście? Mam wrażenie, że chcesz źle podejść do rozwiązania jakiegoś problemu.
adbacz
Chcę napisać aplikację czatu. Z poziomu strony WWW użytkownik łączy się z serwerem i wysyła tam informację (treść wiadomości), a później serwer albo wysyła tą informację (tekst, np JSON) do komputera klienckiego, w tym wypadku mojego, na którym jest zainstalowana aplikacja do odbierania i wysyłania wiadomości na serwer.

No i teraz, zamiast zabijać serwer z poziomu aplikacji na komputerze, chciałem poinformować tą aplikację, że wiadomość przyszła, i albo ją przesłać od razu, albo przesłać info, a aplikacja wykona zapytanie i pobierze tą wiadomość sama.
Crozin
Czyli klasyczny czat?

1. Każdy z klientów łączy się do serwera stałym połączeniem, czyli w przypadku przeglądarek WebSocket, a w przypadku normalnych programów zwykłe połączenie (socket). Po otrzymaniu wiadomości od jednego z klientów serwer rozsyła ją do wszystkich klientów.
2. PHP słabo się do tego nada ze względu na sposób jego pracy (żądanie - odpowiedź, brak dostępu do innych klientów) - proponowałbym tutaj rozważenie Javy bądź C#, które działają jako serwery aplikacji (zawsze masz dostęp do wszystkich klientów swojej aplikacji).
by_ikar
node.js i sockets.io. Jak masz jakieś podstawy z javascriptu, to łatwiej się w tym odnajdziesz, a przykładów już gotowych czatów jest na pęczki. Nawet jest wersja na windowsa (sprawdź WT-NMP jest nawet w wersji portable z ngixem, mysqlem, composerem etc).
adbacz
Problem jest tego typu, że na chwilę obecną nie mam dostępu do serwera, na którym mógłbym używać innego języka niż PHP, chyba, że w CGI, ale to w tedy zostaje mi Python i Perl a żadnego nie znam (i nie wiem, czy na CGI można zrobić tak jak sugerujesz z innym językiem).

Problem jest tego typu:
1. Klientów może być wielu. Klientów będę dodawał ja z poziomu serwera. Każdy klient może mieć jedną domenę.
2. Klienci łączą się z serwerem za pomocą WebSocket (lub jeśli nie ma, wysyłają żądania do serwera zwykłe po odpowiedzi i wysyłają treść wiadomości.
3. Aplikacja na komputerze pobiera dane z serwera, jeśli ten przekaże jej informację, że są jakieś nowe wiadomości.
4. Aplikacja loguje się (tworzy sesję) dla danego użytkownika, który zostanie przypisany do aplikacji w ustawieniach tak, by można było używać czasu jako osobne osoby na kilku komputerach.

Wszystko wiem jak zrobić, z tym nie mam problemu, problem zaczynam mieć gdy chcę poinformować aplikację (nie ważne którą), że są jakieś nowe wiadomości. I tak jak mówię, mam dostęp do serwera tylko z PHP oraz CGI w formie Python oraz Perl.
Crozin
CGI działa dokładnie w takim sam sposób jak mod_php - żądanie -> odpowiedź, wszystko w odizolowanym środowisku. Jeżeli nie masz możliwości zmiany PHP będziesz musiał się trochę "namęczyć".

1. Po otrzymaniu od jednego z klientów jakiejś wiadomości musisz połączyć się z wszystkimi innymi (fsockopen, sockets albo nawet curl jeżeli jest to połączenie do innego serwera HTTP) klientami i wysłać im wiadomość.
2. Powyższy punkt może zająć naprawdę sporo czasu dlatego od razu możesz pomyśleć nad przeniesieniem tego zadania w tło. Zamiast wysyłać wiadomość dodawałbyś ją do jakiejś bazy danych. Na serwerze w tle musiałby działać jakiś skrypt (daemon), który łączyłby się z bazą danych i cyklicznie (1, 2, 10, 30, 60 razy na minutę) sprawdzał czy są jakieś nowe dane. Jeżeli są wysyłałby je do wszystkich klientów.
3. W taki sposób nie wyślesz niczego do klientów, którzy są podłączeni przez WebSocket (tylko klient może zainicjować takie połączenie). Tak więc kod po stronie serwera związany z obsługą WS musiałby robić dokładnie to co jest opisane w pkt. 2.

W skrócie: W PHP jest to bardzo niewygodne zadanie.

by_ikar
To może spróbuj tego: http://reactphp.org/ gdzieś tam widziałem jakieś prelekcje z tego, ale jak to wygląda w praktyce ciężko mi powiedzieć, bo jak zacząłem się bardziej tematem interesować to node wydał mi się bardziej właściwy do tego celu.
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.