pristup k nette z websocket servera

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
manro
Člen | 8
+
0
-

Zdravím, potreboval by som poradiť s prepojením websocket servera [php / ďalej len ws], resp. jeho aplikácie a nette. Ws beží samozrejme samostatne, ale umiestnený môže byť ľubovoľne, s tým že obsahuje SplClassLoader a existuje v namespace WebSocket, ktorý obsahuje aj obslužnú triedu aplikácie.

Ide mi hlavne o prístup ku databáze po tom čo klient zavrie okno… ws spracuje signál, že daný klient sa odpojil + chcel by som previesť nejaké update v databáze…

Filip Procházka
Moderator | 4668
+
0
-

Trošku to rozveď.

manro
Člen | 8
+
0
-

Snažím sa proste implementovať websocket server, samozrejme s tím, aby aplikácia bežiaca na ws komunikovala s nette. Ako server zvolím napríklad túto https://github.com/…hp-websocket implementáciu pre php, Kde sa vytvorí samostatná obsluha pre signály napr:

<?php

namespace WebSocket\Application;

class TestApp extends Application
{
    private $_clients = array();
    private $_filename = '';

    public function onConnect($client)
    {
	$id = $client->getClientId();
        $this->_clients[$id] = $client;
	//klient pripojeny
    }

    public function onDisconnect($client)
    {
        $id = $client->getClientId();
	unset($this->_clients[$id]);
	//klient odpojeny
    }

    public function onData($data, $client)
    {
        $this->_actionEcho($data);
	// nejake data
    }

    private function _actionEcho($text)
    {
	$encodedData = $this->_encodeData('echo', $text);
	foreach($this->_clients as $sendto)
	{
		$sendto->send($encodedData);
        }
    }
}

a v samostatnom skripte sa spustí server

<?php

require(__DIR__ . '/lib/SplClassLoader.php');

$classLoader = new SplClassLoader('WebSocket', __DIR__ . '/lib');
$classLoader->register();

$server = new \WebSocket\Server('127.0.0.1', 8000, false);

// server settings:
$server->setMaxClients(100);
$server->setCheckOrigin(false);
$server->setAllowedOrigin('foo.lh');
$server->setMaxConnectionsPerIp(100);
$server->setMaxRequestsPerMinute(2000);

$server->registerApplication('demo', \WebSocket\Application\TestApp::getInstance());

$server->run();

server s klientom bez problémov funguje: klient odošle dáta ws, ten signál spracuje a odošle dáta klientovi resp. klientom, ktorí následne môžu odoslať iný signál na spracovanie nette… avšak ak klient zavrie browser, ws spracuje signál o odpojení ale ďalej neviem čo :)… napríklad realtime monitorovanie stavu užívateľa → online nie je problém, cez nette uložím do db príznak, ak však zavriem okno, zavriem aj nette…

bazo
Člen | 620
+
0
-

preco by si zatvaral nette? zatvoris akurat spojenie z browsera. s ws server moze s nette aplikaciou komunikovat aj nadalej

Filip Procházka
Moderator | 4668
+
0
-

Já to pořád nechápu :) Nette je na klientu, nebo na serveru? Proč používáš application, když z tama skoro nic nevyužiješ, nebo ano?

manro
Člen | 8
+
0
-

Mám klasickú nette stránku, ktorá cez js komunikuje s ws serverom [ktorý je fyzicky pri nette]. Ws server, resp. TestApp ktorá na ňom beží spracuje príslušný signál [onConnect, onDisconnect, onData, apod.] a odpovie naspäť klientovy, resp. klientom…
Ale ja chcem popri tom v TestApp pracovať aj s databázou, utils apod. z nette…

Edit: posielať z TestApp na nette normalne http requesty?

Editoval manro (17. 4. 2012 21:02)

bazo
Člen | 620
+
0
-

ved si v tej TestApp includni tu druhu appku na nette a budes moct pracovat s db a inymi vecami

manro
Člen | 8
+
0
-

veď to, že ako… som začiatočnik… stačí includnuť nette bootstrap?

bazo
Člen | 620
+
0
-

to by malo stacit, len nespustaj application->run()