Página Inicial > Outros, PHP > PHP-GTK TCP cliente e servidor

PHP-GTK TCP cliente e servidor

Olá pessoal, quanto tempo hem =)

Achei uma coisa[1] ontem que eu precisava vir postar. Um conjunto de classes que cria callbacks de funções de socket. A idéia é muito simples. Ao invez de por exemplo, o script ficar esperando (travado) uma mensagem do servidor, voce configura um callback que faz com que ele seja disparado ao receber uma mensagem. Bom, vou deixar as classes la em baixo, para facilitar, que acho melhor que postar aqui, e vou colocar um código da coisa toda funcionando ok?

Server

<?php
include('tcp.php');
class server
{
   protected $connections = array();
   protected $server = null;
   public function __construct()
   {
      $this->server = Tcp::server('127.0.0.1',1111);
      $this->server->set_accept_hook(array($this,'accept'));
   }
   public function accept($connection)
   {
      $this->connections[] = $connection;
      $connection->set_receive_hook(array($this,'receive'));
   }
   public function receive($sock,$connection)
   {
      echo "server::recieve\n";
      echo "from – ".stream_socket_get_name($sock,true)." – $data";
      $data = fgets($sock);
      echo $data;
      $connection->write($data);
   }
}
$server = new server();
gtk::main();
 

Client

<?php
include('tcp.php');
$client = Tcp::client('127.0.0.1', 1111);
$client->write(".1.1.1.\n.2.2.2.\n.3.3.3.\n.4.4.4.\n");
$client->set_receive_hook('receive');
gtk::main();
function receive($sock,$connection)
{
   $data = fgets($sock,1024);
   echo "from – ".stream_socket_get_name($sock,true)." – $data";
   $connection->write($data);
}
 

Classes tcp.php

<?php
   
class Tcp {

   protected function __construct(){

   }

   static public function server($ip, $port){
      //echo "Tcp::server\n";
      $sock = stream_socket_server("tcp://$ip:$port");
      if ($sock) {
         return new TcpServer($sock);
      }else{
         return null;
      }
   }

   static public function client($ip, $port){
      //echo "Tcp::client\n";
      $sock = stream_socket_client("tcp://$ip:$port");
      if ($sock) {
         return new TcpConnection($sock);
      } else {
         return null;
      }
   }

}

class TcpServer {

   protected $hook = null;
   protected $connected = false;
   protected $sock = null;

   public function __construct($sock){
      //echo "TcpServer::__construct\n";
      $this->connected = true;
      Gtk::io_add_watch($sock,GObject::IO_IN,array($this,"socket_accept"));
   }

   public function socket_accept($sock, $conditions){
      //echo "TcpServer::socket_accept\n";
      $connection = new TcpConnection(stream_socket_accept($sock));
      $this->trigger_hook($connection);
      return $this->connected;
   }

   public function set_accept_hook($hook){
      //echo "TcpServer::set_accept_hook\n";
      $oldhook = $this->hook;
      $this->hook = $hook;
      return $oldhook;
   }

   public function get_accept_hook(){
      //echo "TcpServer::get_accept_hook\n";
      return $this->hook;
   }

   protected function trigger_hook($connection){
      //echo "TcpServer::trigger_hook\n";
      if ($this->hook) {
         call_user_func_array($this->hook,array($connection));
      }
   }

   protected function __clone(){

   }

}

class TcpConnection {

   protected $hook = null;
   protected $sock = null;
   protected $connected = false;

   public function __construct($sock){
      //echo "TcpConnection::__construct\n";
      $this->connected = true;
      $this->sock = $sock;
      Gtk::io_add_watch($sock,GObject::IO_IN,array($this,"data_in"));
   }

   public function data_in($sock, $conditions){
      //echo "TcpConnection::data_in\n";
      if ($this->hook) {
         call_user_func_array($this->hook, array($this->sock,$this));
      }
      return $this->connected;
   }

   public function write($data){
      //echo "TcpConnection::write\n";
      return fwrite($this->sock, $data, strlen($data));
   }

   public function set_receive_hook($hook){
      //echo "TcpConnection::set_receive_hook\n";
      $oldhook = $this->hook;
      $this->hook = $hook;
      return $oldhook;
   }

   public function __destruct(){
      //echo "TcpConnection::__destruct\n";
      fclose($this->sock);
   }

}
 

[1] – http://leonpegg.blogspot.com/2007/01/php-gtk-tcp-clientserver-classes.html

Categories: Outros, PHP Tags:
  1. Nenhum comentário ainda.
  1. Nenhum trackback ainda.