[concluido]custo comunicação socket udp, socket tcp, HTTP

Olá implementei um sistema que se comunica com um servidor web(aplicacao php), os sistemas trocam mensagens de texto, se eu for calcular em bytes
não passam de 100 bytes(100 caracteres), porém quando saio do sistema móvel ele automaticamente mostra a mensagem ‘x bytes transferidos’, e geralmente esse valor de ‘x’ é no mínimo 2000 bytes, o meu sistema móvel por exemplo faz login no sistema web passando ‘usuario’ e ‘senha’, e retorna uma mensagem de uns 20 caracteres, após o login eu saio da aplicação e ele diz q foram trafegados quase 2000 bytes, e com isso gera um gasto para o usuário, estou procurando alguma forma de diminuir os bytes transferidos, gostaria de saber se caso eu utilize socket UDP, o numero de bytes diminuirá, pq como utilizo HTTP, POST, deve gerar um cabeçalho muito maior q o proprio conteudo da mensagem, ou alguem pode me dar alguma ideia de outra forma?

obrigado

Com UDP o número de bytes vai ser sim, muitíssimo menor. Ele também te poupa o custo do estabelecimento de uma conexão.
Entretanto, tome cuidado pq vc corre o risco de perder algumas mensagens durante a transmissão.

Se você precisa que a mensagem seja realmente entregue, então, use TCP diretamente no lugar, sem o http.
Ou então, confirme o recebimento do lado do servidor e faça retransmissão, caso essa confirmação não chegue.

Para transferir coisas maiores, como arquivos, o TCP é muito mais indicado. Ele controla fluxo, ordenação dos dados, erros e perdas de pacotes. Fazer isso no braço seria perda de tempo e dificilmente ficaria melhor do que nas implementações do TCP. Até pq o TCP roda em modo núcleo e muitas vezes tem porções feitas em hardware.

O HTTP impõe um overhead considerável, principalmente por ser baseado em texto.

valeu Vinigod, vou implementar isso, depois coloco os números aqui, de quanto diminuiu em cada caso.

Verifique se o seu celular suporta SocketConnection. Se sim, você poderá estabelecer uma conexão TCP sem precisar pagar o preço de estar usando o overloard que o HTTP impõe, ou seja, se transmitir 2 bytes, serão 2 bytes e nada mais.

Do lado do servidor, você terá que desenvolver um programa que aceite esta conexão em uma determinada porta, abra e gerencie este tráfego, afinal, você abriu mão da conveniência que tinha para receber a mensagem usando um Apache,etc…e agora você mesmo é responsável por fazer isto.

É o preço que se paga por querer economizar os bytes na transmissão. É mais trabalho principalmente do lado servidor que agora é vc que tem que gerenciar.

valeu boone, estou fazendo isso mesmo, agora vc perguntou se meu celular suporta SocketConnection, bom isso eu ainda nao testei, pensei que se suportasse HTTPConnection iria suportar SocketConnection, então como q funciona a maioria dos celulares suportam SocketConnection ou não?

A maioria suporta SocketConnection, por exemplo, Nokia S40 e S60, Motorolas A3, A4, A5, A6, etc…

Não há como saber se o aparelho suporta ou não, sem testar a presença da classe:

boolean suportaSockets = false;
try {
	Class.forName("SocketConnection");
	suportaSockets = true;
} catch (ClassNotFoundException e) {
}

Posso estar enganado, mas SocketConnection já faz parte de qualquer aparelho MIDP 2.0. Nos MIDP 1.0, ela era opcional.

Isto é feito pois as vezes alguns sites podem dar falsas informações sobre o aparelho, então, nada mais apropriada do que em run-time você testar.

durante a execução do programa eu posso saber por exemplo como está a utilização da memoria

Runtime rt = Runtime.getRuntime();
rt.totalMemory();
rt.freeMemory();

será que tem como saber a quantidade de bytes transferidos? to procurando mas não acho

[quote=mirv]durante a execução do programa eu posso saber por exemplo como está a utilização da memoria

Runtime rt = Runtime.getRuntime();
rt.totalMemory();
rt.freeMemory();

será que tem como saber a quantidade de bytes transferidos? to procurando mas não acho
[/quote]

Procure por um post aqui no GUJ onde eu dei a dica do software Wireshark.

bom, valeu ter tentado, consegui diminuir o tamanho dos dados cerca de 4 vezes, usando socket tcp, ai vai um pouco de codigo

servidor, em php

<?php

// don't timeout
set_time_limit (0);

$host = "192.168.0.118";
$port = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

$result = socket_listen($socket, SOMAXCONN) or die("Could not set up socket listener\n");

echo "Waiting for connections...\n\n";

do {
	$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");

	echo "Received connection request\n";

	//aguarda a solicitacao do usuario
	$input = socket_read($spawn, 2048) or die("Could not read input\n");

	echo "Solicitacao: $input\n";

	//responde a solicitacao do usuario
	socket_write($spawn, $input , strlen ($input)) or die("Could not write output\n");		
	echo "Responde solicitacao: " . trim($input) . "\n";

	socket_close($spawn);//fecha conexao
	echo "servidor fechou\n-------------\n";
		

} while (true);

socket_close($socket);

?> 

cliente em php

<?php

$host="192.168.0.118";
$port = 9000;

$fp = fsockopen ($host, $port, $errno, $errstr);

if (!$fp) {
	$result = "Error: could not open socket connection";
}
else {

	//solicita algo no servidor
	fputs ($fp, "quero agua");
		
	//obtem a resposta
	echo fgets ($fp, 2048);

	
	fclose ($fp);

}

?>

cliente em java, j2me

SocketConnection connection = null;
OutputStream output = null;
InputStream in = null;

try {									
	connection = (SocketConnection) Connector.open("socket://192.168.0.118:9000");	
	
	output = connection.openOutputStream();
	in = connection.openInputStream();

	//solicita algo no servidor
	output.write(string1.getBytes());
	output.flush();
	//--

	//obtem a resposta
	int ch;
	while( ( ch = in.read() ) != -1 ) {
		System.out.print((char)ch);
	}			
	//--


	this.main.destroyApp(false);
	this.main.notifyDestroyed();

} catch (Exception e) {
	e.printStackTrace();

} finally {  
	try {  
		if(in != null) {  
			in.close();  
		}
		if(output != null) {  
			output.close();  
		}  
		if(connection != null) {  
			connection.close();  
		}  
	} catch(Exception e) {  
		e.printStackTrace();  
	}  
}      

o servidor funciona como HTTP, recebe uma solicitacao, responde e fecha a conexao, cada vez q o cliente quer algo repete o processo.

antes um simples login gerava aproximadamente 1200 bytes, agora gera em torno de 300 bytes. não testei com UDP, mas pra mim ta bom. valeu.

[quote=mirv]o servidor funciona como HTTP, recebe uma solicitacao, responde e fecha a conexao, cada vez q o cliente quer algo repete o processo.

antes um simples login gerava aproximadamente 1200 bytes, agora gera em torno de 300 bytes. não testei com UDP, mas pra mim ta bom. valeu.[/quote]

É isso aí…parabéns ! :thumbup:
Você conseguiu porquê não esmoreceu frente as dificuldades, arregaçou as mangas e foi a luta !
Ao contrário de você, o que tenho visto de carinha novo por aí que não tem paciência, não quer saber de pesquisar, quer tudo pronto…meu Deus !!! :cry: