Jump to content


Photo

Server Socket Conecta Com Sqlite E Busca Dados


  • Faça o login para participar
Nenhuma resposta neste tópico

#1 Josy

Josy

    :*

  • Usuários
  • 662 posts
  • Sexo:Feminino
  • Localidade:Porto Alegre/RS

Posted 19/12/2007, 16:25

Toda vez q o server receber uma msg pela porta deve conectar banco, fazer uma busca e retornar alguma coisa.. Ele está fazendo isso, mas consulta o bd uma única vez e nao a cada msg q ele receber do client, segue o código do server e da consulta...

server.php
[codebox]
<?php

define('MAXLINE', 1024); //TAMANHO DO SOCKET RECEBIDO
define('LISTENQ', 50);
define('PORT', 81); //PORTA PADRÃO PARA CONEXÃO
define('FD_SETSIZE', 2); //Nº MÁXIMO DE CLIENTES PERMITIDO POR CONEXÃO

//PARA MATAR O SERVIDOR
function killDaemon()
{
global $listenfd, $client;
$msg = "Fechando servidor!!\n";
for ($i = 0; $i < FD_SETSIZE; $i++)
{
if ($client[$i] != null)
{
socket_write($client[$i], $msg, strlen($msg));
socket_close($client[$i]);
}
}
print "DESCONECTAR!!\n";
socket_close($listenfd);
exit;
}


//QUANDO O CLIENTE DESCONECTAR
function closeClient($i)
{
global $client, $remote_host, $remote_port;
print "closing client[$i] ({$remote_host[$i]}:{$remote_port[$i]})\n";
socket_close($client[$i]);
$client[$i] = null;
unset($remote_host[$i]);

//VERIFICA SE HÁ CLIENTE CONECTADO, FAZ O DESCONECT
$someoneconnected = false;

for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if($client[$i] != null)
{
$someoneconnected = true;
break;
}
}

if($someoneconnected == false)
{
//killDaemon();
}
}

$listenfd = socket_create(AF_INET, SOCK_STREAM, 0);

if ($listenfd)
print "Escutando a porta " . PORT . "\n";
else
die("Socket morreu!!\n");

//CONFIGURAÇÃO IP DO SERVER
socket_setopt($listenfd, SOL_SOCKET, SO_REUSEADDR, 0);
if (!socket_bind($listenfd, "0.0.0.0", PORT))
{
socket_close($listenfd);
die("Não foi possível conectar!!\n");
}
socket_listen($listenfd, LISTENQ);

for ($i = 0; $i < LISTENQ; $i++)
$client[$i] = null;

while(1)
{
$rfds[0] = $listenfd;
{
for ($i = 0; $i <= FD_SETSIZE; $i++)
if ($client[$i] != null)
$rfds[$i + 1] = $client[$i];
}

//BLOQUEIA INDEFINITAMENTE ATÉ RECEBER UMA CONEXÃO
$nready = socket_select($rfds, $null, $null, null);

//SE TEMOS UMA CONEXÃO
if (in_array($listenfd, $rfds))
{
print "Criando novo cliente!!\n";//LISTENFD OUVIU ALGO

//PEGA O NOVO LOCAL
for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if ($client[$i] == null)
{
$client[$i] = socket_accept($listenfd);
socket_setopt($client[$i], SOL_SOCKET, SO_REUSEADDR, 0);
socket_getpeername($client[$i], $remote_host[$i], $remote_port[$i]);
print "Aceitar {$remote_host[$i]}:{$remote_port[$i]} as client[$i]\n";

if ($i < FD_SETSIZE)
{
break;
}
}

if ($i >= FD_SETSIZE)
{
//NO CASO DE MUITOS CLIENTES
closeClient($i);
break;
}
}
if (--$nready <= 0)
continue;
}


//VERIFICA OS CLIENTES PARA RECEPÇÃO DE DADOS
for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if ($client[$i] == null)
continue;

if (in_array($client[$i], $rfds))
{
$n = trim(socket_read($client[$i], MAXLINE));

if (!$n)
closeClient($i);
else
{
//QDO O CLIENTE ENVIA OS DADOS ABAIXO
if ($n == "/killme")
killDaemon();
else if ($n == "/quit")
closeClient($i);
else
{
//IMPRIME ALGO NO SERVIDOR
print "From {$remote_host[$i]}:{$remote_port[$i]}>client[$i]: $n\n";
for ($j = 0; $j <= FD_SETSIZE; $j++)
{
if ($client[$j] != null)
{
//INCLUI PÁGINA DE CONSULTA AO BD
include_once('sqlite.php');
socket_write($client[$j], $resultado);
}
}
}
}

if (--$nready <= 0)
break;
}
}
}

?>


[/codebox]

sqlite.php
[codebox]
<?
//caso a base de dados não exista, ele tenta criar
if ($db = sqlite_open("C:/Documents and Settings/josy/Desktop/sqlite/teste.db", 0666, $error))
{
echo "Banco de dados aberto...";

//cria a tabela
//@sqlite_query($db, "CREATE TABLE consulta( id INTEGER PRIMARY KEY, nome TEXT, numero TEXT)");

//insere dados
/*sqlite_query($db, "INSERT INTO consulta VALUES( NULL, 'número_1', '1111111')");
sqlite_query($db, "INSERT INTO consulta VALUES( NULL, 'número_2', '2222222')");
sqlite_query($db, "INSERT INTO consulta VALUES( NULL, 'número_3', '3333333')");
sqlite_query($db, "INSERT INTO consulta VALUES( NULL, 'número_4', '4444444')");*/

//exibe os dados cadastrados
$sql = sqlite_query($db, "SELECT id, nome, numero FROM consulta WHERE numero=$n");
$i = sqlite_fetch_array($sql);
$resultado = "ID: ".$i['id']." Nome: ".$i['nome']." N&uacute;mero: ".$i['numero'];

}
else
{
die($error);
}
?>
[/codebox]

A primeira vez q o client conecta e envia uma msg, no servidor aparece:

Escutando porta 81
Aceitar 127.0.0.1:2287 as client[0]
From 127.0.0.1:2287>client[0]2222222
Banco de dados aberto...

E no client aparece:
Id: 2 Nome: numero_2 Número: 2222222

Na segunda msg q o client manda aparece no servidor:
From 127.0.0.1:2287>client[0]: 1111111

E no client aparece o mesmo de antes:
Id: 2 Nome: numero_2 Número: 2222222, pq nao consultou o bd.. o q fazer para consultar a toda msg q receber?

Tentei em vez de chamar outro arquivo para a conexão sqlite.php, coloquei uma function para só fazer a conexão no inicio do script e uma function só para consultar o arq de bd, mas tem algo errado pq nao tah retornando a conexao para a variavel $db, entoa nao consigo fazer o select depois, como faço??

[codebox]
<?php

define('MAXLINE', 1024); //TAMANHO DO SOCKET RECEBIDO
define('LISTENQ', 50);
define('PORT', 81); //PORTA PADRÃO PARA CONEXÃO
define('FD_SETSIZE', 2); //Nº MÁXIMO DE CLIENTES PERMITIDO POR CONEXÃO

//PARA MATAR O SERVIDOR
function killDaemon()
{
global $listenfd, $client;
$msg = "Fechando servidor!!\n";
for ($i = 0; $i < FD_SETSIZE; $i++)
{
if ($client[$i] != null)
{
socket_write($client[$i], $msg, strlen($msg));
socket_close($client[$i]);
}
}
print "DESCONECTAR!!\n";
socket_close($listenfd);
exit;
}


//QUANDO O CLIENTE DESCONECTAR
function closeClient($i)
{
global $client, $remote_host, $remote_port;
print "closing client[$i] ({$remote_host[$i]}:{$remote_port[$i]})\n";
socket_close($client[$i]);
$client[$i] = null;
unset($remote_host[$i]);

//VERIFICA SE HÁ CLIENTE CONECTADO, FAZ O DESCONECT
$someoneconnected = false;

for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if($client[$i] != null)
{
$someoneconnected = true;
break;
}
}

if($someoneconnected == false)
{
//killDaemon();
}
}

//CONECTA COM SQLITE
function conecta()
{
//caso a base de dados não exista, ele tenta criar
if ($db = sqlite_open("C:/Documents and Settings/josy/Desktop/sqlite/teste.db", 0666, $error))
return $db;
else
die($error);
}

function consulta($n,$db)
{
$sql = sqlite_query($db, "SELECT id, nome, numero FROM consulta WHERE numero=$n");
$i = sqlite_fetch_array($sql);
$resultado = "ID: ".$i['id']." Nome: ".$i['nome']." Numero: ".$i['numero'];
}

$listenfd = socket_create(AF_INET, SOCK_STREAM, 0);

if ($listenfd)
print "Escutando a porta " . PORT . "\n";
else
die("Socket morreu!!\n");

//CONFIGURAÇÃO IP DO SERVER
socket_setopt($listenfd, SOL_SOCKET, SO_REUSEADDR, 0);
if (!socket_bind($listenfd, "0.0.0.0", PORT))
{
socket_close($listenfd);
die("Não foi possível conectar!!\n");
}
socket_listen($listenfd, LISTENQ);

for ($i = 0; $i < LISTENQ; $i++)
$client[$i] = null;

while(1)
{
$rfds[0] = $listenfd;
{
for ($i = 0; $i <= FD_SETSIZE; $i++)
if ($client[$i] != null)
$rfds[$i + 1] = $client[$i];
}

//BLOQUEIA INDEFINITAMENTE ATÉ RECEBER UMA CONEXÃO
$nready = socket_select($rfds, $null, $null, null);

//SE TEMOS UMA CONEXÃO
if (in_array($listenfd, $rfds))
{
print "Criando novo cliente!!\n";//LISTENFD OUVIU ALGO

//CONECTA COM SQLITE
conecta();

//PEGA O NOVO LOCAL
for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if ($client[$i] == null)
{
$client[$i] = socket_accept($listenfd);
socket_setopt($client[$i], SOL_SOCKET, SO_REUSEADDR, 0);
socket_getpeername($client[$i], $remote_host[$i], $remote_port[$i]);
print "Aceitar {$remote_host[$i]}:{$remote_port[$i]} as client[$i]\n";

if ($i < FD_SETSIZE)
{
break;
}
}

if ($i >= FD_SETSIZE)
{
//NO CASO DE MUITOS CLIENTES
closeClient($i);
break;
}
}
if (--$nready <= 0)
continue;
}


//VERIFICA OS CLIENTES PARA RECEPÇÃO DE DADOS
for ($i = 0; $i <= FD_SETSIZE; $i++)
{
if ($client[$i] == null)
continue;

if (in_array($client[$i], $rfds))
{
$n = trim(socket_read($client[$i], MAXLINE));

if (!$n)
closeClient($i);
else
{
//QDO O CLIENTE ENVIA OS DADOS ABAIXO
if ($n == "/killme")
killDaemon();
else if ($n == "/quit")
closeClient($i);
else
{
//IMPRIME ALGO NO SERVIDOR
print "From {$remote_host[$i]}:{$remote_port[$i]}>client[$i]: $n\n";

for ($j = 0; $j <= FD_SETSIZE; $j++)
{
if ($client[$j] != null)
{
//CONSULTA VALOR DIGITADO NO CLIENT PARA A FUNÇAÕ
consulta($n,$db);

//ESCREVE A RESPOSTA PARA O CLIENT
socket_write($client[$j], $resultado);
}
}
}
}

if (--$nready <= 0)
break;
}
}
}

?>


[/codebox]

Tah dando erro: sqlite_query() expects parameter 1 to be resource
E vejo q a function consulta nao consegue trabalhar com o valor de $db

Resolvido, faltava um global $db; na function conecta e global $resultado; na funcion consulta

___________________________________

Josy R.L.
Grupo Plyme
www.plyme.com.br
___________________________________





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq