Sockets Java X PHP

7 respostas
jeveaux

Oi

Pessoal, estou precisando de uma ajuda urgente de vcs. Estou com um probleminha em um projjeto que estou trabalhando.

Tenho um servidor que gera dados aleatoriamente para os testes durante o andamento do projeto, porém está em PHP e tenho que fazer uma conxão via socket de uma applet para ele. Até aí tudo blz.

sk = new Socket("192.168.1.211",7777);
         
         output = new ObjectOutputStream(sk.getOutputStream());
         output.flush();

         output.writeObject("GET / HTTP/1.0

");
         output.flush();
         
         input = new ObjectInputStream(sk.getInputStream()); //PARA AQUI

A conexão via socket não é o problema, o trecho acima funciona bem, eu vejo no servidor que o processo iniciou, mas o servidor só envia dados se eu enviar uma String para ele, e é aí que está o problema, o servidor precisa receber esta String output.writeObject("GET / HTTP/1.0

"); e quando envio está String ele só recebe 1 (um), fica um monte de uns… E depoiis fica tudo parado, obviamente esperando em input = new ObjectInputStream(sk.getInputStream()); porque o servidor não recebeu a String.

Se alguém tiver alguma idéia ou solução, mada aí.

T+

7 Respostas

cv1

Leia o JavaDoc das classes ObjectInputStream e ObjectOutputStream e veja onde vc errou :wink:

jeveaux

Oi

cv, aí que está o problema, parece estar correto, quando eu mudo o endereço do socket, para um socket Java funciona tudo normalemente, o servidor recebe a String corretamente.

T+

jeveaux

Oi

uuooowwww.. Consegui fazer o servidor entender a mensagem, agora ele já estando quando eu envio a String de conexão, só que agora o erro é o outro: StreamCorruptedException.... Ou seja, o erro agora é ao receber os dados do servidor.

Eu resolvi o problema assim:

No lugar do ObjectOutputStream eu usei um PrintStream com o método abaixo:

ps = new PrintStream(sk.getOutputStream());
		writeNetPrintStream(ps,"GET / HTTP/1.0

");

void writeNetPrintStream(PrintStream output, String str) {
		byte[] b;
		
		int l = str.length();
		b = new byte[l];
		str.getBytes(0, l ,b , 0);
		System.out.println("Tentando enviar Bytes - PrintStream");
		try {
			output.write(b);
			System.out.println("OK - bytes PrintStream");
		}
		catch(IOException ioex) {
		}
		
	}

T+

cv1

Voce ainda nao resolveu o problema, vc só retardou ele um pouco. :wink:

Pq não usar a classe java.net.URL pra fazer o GET / … pra vc?

jeveaux

Oi

cv, agora eu consegui resolver o problema sim, estou enviando a String GET para o servidor e estou lendo os dados recebidos normalmente...

try {
			sk = new Socket("192.168.1.211",7777);

	        ps = new PrintStream(sk.getOutputStream(), true);
			ps.print("GET / HTTP/1.0 n  n");
			
			BufferedReader buff = new BufferedReader(new InputStreamReader(sk.getInputStream()));
			String result;     
			while ((result = buff.readLine()) != null)
					System.out.println(result);
			
		}
		catch (UnknownHostException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

T+

cv1

Ta, mas pq nao usar java.net.URL? Ela ja faz tudo isso!

dukejeffrie

Mais do que isso, c tá usando mil wrappers a mais, cara…

ObjectOutputStream é pra escrever objetos. PrintStream é pra escrever texto.

Pra escrever bytes, um InputStream qualquer serve!! E pra escrever um só byte, tem milhares de libs aih.

Seu programa iria dar pau se tivesse um caractere não-ASCII na sua String. Dá pra melhorar muito isso aí ainda…

Um código com URL ia ficar mais limpo e menos sujeito a erros de fora. Mas eu acho mais bonito com Socket… questão de gosto.

Ah, e pelamordedeus, nunca faça isso:

catch(IOException ioex) {
      }

Um dia seu prog não funciona e vc não consegue descobrir porque. Pelo menos bota um e.printStackTrace(System.err)

Tudo de bom!

Criado 12 de fevereiro de 2004
Ultima resposta 13 de fev. de 2004
Respostas 7
Participantes 3