Socket Java, help with in.read()

Bom,

Meu objetivo é fazer uma comunicação de um server rodando php com um aplicativo java utilizando sockets…

O server php ja ta funcionando, testei utilizando um aplicativo SocketWorkbench.

Meu servidor basicamente (e inicialmente para testes) reenvia ao cliente a mensagem que o cliente enviou.

fiz seguinte teste…

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class App {

	/**
	 * @param args
	 */
	
	private static final String url = "localhost";
	private static final int port = 8000;
	private static Socket socket;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
	
		OutputStream out;
		InputStream in;
		
		
		socket = new Socket(url, port);
		out = socket.getOutputStream();
		in = socket.getInputStream();
		
		out.write('f');
		out.flush();
		
		int i = in.read();
		
		System.out.println(i);
	
		out.close();
		in.close();
		socket.close();
		
	}

}

mas o aplicativo fica na espera na linha 30, meio que esperando uma resposta…

Pedindo ajuda, nao faço ideia…

segue o codigo php caso seja necesário

[code]<?php

//Tempo indefinido.
set_time_limit (0); 

$port = 8000;
$max_clients = 10;
$server_ip = '127.0.0.1';

$connectionOk = "Communication Established";
$downloadDB = "Download Database";
$downloadStart = "Initializing download: ";
$transmitionOk = "Done";
$downloadImg = "Download Images";
$uploadSales = "Upload sales";
$endMsg = "\0";

//Não Sei

// error_reporting(1);
// ini_set(‘display_errors’, ‘1’);

//Cria o socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

//nao faço ideia.

// socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

// especifica o ip e a porta de escuta
socket_bind($socket, $server_ip, $port);

// Deixa o socket em estado de escuta.
socket_listen($socket, $max_clients);


// Cria um vetor, que na posição 0 é um (vetor que na posição 'sockets' é $socket
$clients = array('0' => array('socket' => $socket));

while(TRUE) 
{
	$read[0] = $socket;

	//Prepara os clients para leitura.
	for($i=1; $i<count($clients)+1; ++$i)
	{
		if($clients[$i] != NULL)
		{
			$read[$i+1] = $clients[$i]['socket'];
		}
	}

// socket_select() accepts arrays of sockets and waits for them to change status.
// On success socket_select() returns the number of socket resources contained in the modified arrays, which may be zero if the // Timeout expires before anything interesting happens.
$ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);

	//verifica se está cotido em...
	if(in_array($socket, $read))
	//objetivo do if. pega um unico socket e taca no clients, aceita um client.
	{
		
		for($i=1; $i < $max_clients+1; ++$i)
		{	
			//Returns TRUE if var exists and has value other than NULL, FALSE otherwise.
			if(!isset($clients[$i])) 
			{
				//retorna o proximo client pronto
				$clients[$i]['socket'] = socket_accept($socket);

				//pega ip.
				socket_getpeername($clients[$i]['socket'],$ip);

				$clients[$i]['ipaddy'] = $ip;
				
				

				//socket_write($clients[$i]['socket'], 'Communication Established');
				/*socket_write($clients[$i]['socket'], 'There are '.(count($clients) - 1).' client(s) connected to this server.'."\r\n");*/

				//echo 'New client connected: ' . $clients[$i]['ipaddy'] .' ';
				break;
			}
			elseif($i == $max_clients - 1)
			{
				//echo 'To many Clients connected!'."\r\n";
			}

			if($ready < 1)
			{
				continue;
			} 
		}
	}

	for($i=1; $i<$max_clients+1; ++$i)
	{
		//Se está no array de leitura, ou seja, pronto
		if(in_array($clients[$i]['socket'], $read))
		{

		//	ler se há data. se tiver retorna.
			$data = @socket_read($clients[$i]['socket'], 1024, PHP_NORMAL_READ);

			if($data === FALSE)
			{
			//	destroys the specified variables;
				unset($clients[$i]);
				//echo 'Client disconnected!',"\r\n";
				continue;
			}

// returns a string with whitespace stripped from the beginning and end of str.
$data = trim($data);

			if(!empty($data))
			{
				if($data == 'exit')
				{
					//socket_write($clients[$i]['socket'], 'Thanks for trying my Custom Socket Server, goodbye.'."\n");
					//echo 'Client ',$i,' is exiting.',"\n";
					unset($clients[$i]);
					continue;
				} 

					for($j=1; $j<$max_clients+1; ++$j)
					{
						//Returns TRUE if var exists and has value other than NULL, FALSE otherwise.
						if(isset($clients[$j]['socket']))
						{
							if(($clients[$j]['socket'] != $clients[$i]['socket']) && ($clients[$j]['socket'] != $socket))
							{
								echo($clients[$i]['ipaddy'] . ' is sending a message!'."\r\n");
								socket_write($clients[$j]['socket'], '[' . $clients[$i]['ipaddy'] . '] says: ' . $data . "\r\n");
							}
						}
					}
				break;
			}
		}
	}
}

?>
[/code]

Ja que o titulo é em inglês você deve entender isso aqui abaixo !
http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

Ola, creio que ele fica na espera de uma msg, enquanto não recebe-la ele não irá passar daí.

Dupliquei esse tópico sem querer… É que apareceu uma mensagem quando enviei e acreditei que não tivesse sido enviado com sucesso.

Com relação ao título peço perdão se constragi alguem.

Bom, eu sei que in.read fica a espera de uma mensagem, como disse, testei com um aplicatio e essa mensagem estava sendo enviada pelo servidor para o cliente. Sendo assim, porque nessa aplicação ele ficaria em espera uma vez que a mensagem foi enviada para o cliente?

tem certeza de que o cliente e o servidor estão devidamente conectados e recebendo mensagens?
verifique sua conexão e depois verifica onde está recebendo, está me parecendo meio vago.

O erro está no php, tentei debugar, mas bem na parte crititica o eclipse me deixou na mão…

no final tem assim…

for($i=1; $i<$max_clients+1; ++$i)
		{
			//Se está no array de leitura, ou seja, pronto
			if(in_array($clients[$i]['socket'], $read))
			{

			//	ler se há data. se tiver retorna.
				$data = @socket_read($clients[$i]['socket'], 1024, PHP_NORMAL_READ);

				if($data === FALSE)
				{
				//	destroys the specified variables;
					unset($clients[$i]);
					//echo 'Client disconnected!',"\r\n";
					continue;
				}

				//	returns a string with whitespace stripped from the beginning and end of str.
				//$data = trim($data);

				
					@socket_write($clients[$i]['socket'], "AEW!");
				
			}
		}
	}
?>

ou seja, era pra eu receber aew como resposta pra qualquer mensagem que eu enviar, só que isso nao acontece, nao sei pq.

o debug que uso no eclipse me deixa na mao na hora que chega em

$data = @socket_read($clients[$i]['socket'], 1024, PHP_NORMAL_READ);

Alguem poderia me ajudar?

Aí to caindo fora pq php não é minha área…
flw

Bom, primeiro quero confirmar sua intenção: Você tem uma aplicação PHP, e você quer que a aplicação Java fique “escutando” em uma porta, enquanto o servidor PHP fica mandando dados para a sua aplicação. Estou correto?

Se este é o caso, me parece que você está usando o construtor errado: Socket(url, port) é para que a aplicação Java “fale” com algum servidor que já está ligado. Por exemplo, você poderia com o socket nesta condição mandar comandos HTTP para o seu servidor PHP usando esta opção. POr exemplo, dar um “get” em uma página PHP…

No seu caso, o servidor PHP é que vai mandar algo para a porta do seu “servidor” java, certo? Neste caso, você precisa criar um Socket desconectado, e dar um “bind” na porta em que quer ficar escutando.

Ou seja:

Socket c = [b]new Socket()[/b];
c.bind(<<porta em que quer ficar escutando>>);

Mas veja o javadoc do socket, que <> é na verdade um SocketAddress…
aí, você tem que manter um loopzinho aí, pra deixar seu socket “na moita”, escutando a porta. Para não ser bloqueante, como o método read(), verifique se há dados no inputStream com o método “available()”.

Nota: não testei nada disso. Só li o javadoc do Socket. Mexi com sockets há muuuuuuuito tempo atrás.

Sugestão: o Jakarta Commons FTP é uma suite open source de comunicação FTP. Eles certamente usam sockets e devem usar muito bem. Dá pra puxar umas idéias de lá…

Nota 2: Lembre-se que provavelmente você possui firewall na máquina em questão. Essa porta está aberta?

Agora, se seu problema na verdade é que você quer “pegar” coisas no java, que são fornecidas pelo provedor PHP, de repente vale a pena usar uma API de emulação do protocolo HTTP, tipo a HttpClient, e criar uma página PHP para gerar respostas … Que daí toda essa complexidade de manter sockets fica “debaixo dos panos” para você.

OPS… parece que você quer o contrário, não é? Você quer que o PHP atue como um “servidor” especial, na porta 8000? Cara… pra que q tu quer isso??? Será que usar a commons HttpClient não resolve isso pra você? Ou seja, a aplicação java chamar uma página PHP?