Enviando XML para um Servidor na porta 60001

Olá Pessoal do GUJ,

Tenho uma dúvida em relação a tarefa que tenho que fazer… Tenho que enviar um XML para o servidor na porta 60001 para que ele me retorne um outro XML, mas o problema é que eu não tenho muito noção de como fazer isso, Estou postando o meu fonte que tentei executar mas sem sucesso… não tenho certeza se esse código realmente supri as minhas necessidades, pois nunca mexi com a classe Socket e nem sei se esse seria o jeito mais simples de fazer.

Por acaso alguém pode me ajudar?

package meupacote;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class ServerConnection {
	public ServerConnection() {
		try {
			Socket socket = new Socket("meu.ip.em.string", 60001);
			ObjectInputStream in = new ObjectInputStream(socket
					.getInputStream());
			ObjectOutputStream out = new ObjectOutputStream(socket
					.getOutputStream());

                        // O XML que será enviado
			String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> "
					+ "<BotMessage messageType=\"Request\"> "
					+ "<UUID value=\"60b6c9t2-y568-4o83-bte6-d36585cba749\"/> "
					+ "<param name=\"RequestType\" value=\"INFO\"/> "
					+ "<param name=\"InfoMethod\" value=\"2:aboutus\"/> "
					+ "<param name=\"Test\" value=\"test.com\"/> "
					+ "</BotMessage>";

			out.writeObject(xml);
			String resp = (String) in.readObject();
			System.out.println(resp);
	
			out.close();
			in.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new ServerConnection();
	}
}

Obrigado.

PS: O servidor é linux e para testar se realmente funciona eu executo isso no servidor - cat teste_de_xml.xml | nc localhost 60001

Você não pode usar ObjectInput/OutputStream. No seu caso, provavelmente você deve usar diretamente o InputStream ou OutputStream retornado pelo socket, e você tem de converter e desconverter a string XML para um array de bytes.

Muito Obrigado pela rápida resposta thingol, eu fiz uns pequenos testes e ainda não obtive sucesso… acho que esteja fazendo algo de errado… tentei o código abaixo e obtive a seguinte exceção:

java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366)

[code]public class ServerConnection {
public ServerConnection() {
try {
Socket socket = new Socket(“id.do.meu.servidor”, 60001);
OutputStream out = socket.getOutputStream();

		byte[] xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <BotMessage messageType=\"Request\"> <UUID value=\"12d23dx-d558-4a33-bfe6-d13487abc345\"/> <param name=\"RequestType\" value=\"INFO\"/> <param name=\"InfoMethod\" value=\"1:aboutus\"/> <param name=\"Teste\" value=\"teste.com\"/> </BotMessage>"
				.getBytes();

		out.write(xml);

		out.close();
		socket.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

public static void main(String[] args) {
	new ServerConnection();
}

}[/code]

Obrigado!

a) Não seria interessante você pegar também a InputStream?
b) Já que você começou a testar, veja se o tal “id.do.meu.servidor” resolve para um endereço válido na máquina que está rodando seu programa.

[quote=thingol]a) Não seria interessante você pegar também a InputStream?
b) Já que você começou a testar, veja se o tal “id.do.meu.servidor” resolve para um endereço válido na máquina que está rodando seu programa. [/quote]
Obrigado thingol,

Bom… eu coloquei a InputStream, agora quando coloco o ip do servidor ainda gera a mesma exceção… só que estou conectado no servidor via Putty utilizando a porta 2222… e no código quando eu coloco a porta 2222 ele roda normalmente… só que o problema é que eu tenho que enviar o XML pela porta 60001 que é a que retorna o XML de resposta… será que eu tenho que usar o Socket(“ip.do.servidor”, 2222) e depois enviar o XML pela porta 60001? Se sim, como farei isso?

Obrigado.

Vou fazer uma pergunta séria. Se você der o seguinte comando pelo Windows (em um Prompt de Comando; talvez tenha de instalar o telnet.exe)

telnet id.do.meu.servidor 60001

O que ocorre?

a) Aparece uma tela preta quase instantaneamente. Talvez apareça alguma sujeira. Talvez, depois de algum tempo, a tela feche sozinha.
b) O telnet fica preso, tentando se conectar. Ou então ele mostra uma mensagem parecida com a seguinte:

Conectando-se a id.do.meu.servidor...Não foi possível abrir conexão com host na porta 60001
: conexão falhou

Se for o caso “b”, então verifique se o firewall do Windows está habilitado para você poder conectar-se a outra máquina pela porta 60001.
Se for o caso “a”, não haveria porque seu programa não funcionar direito.

Acho que é o caso “b”. Se for isso, cheque a conectividade da sua máquina para o tal servidor que atende na 60001.

[quote=thingol][quote]
só que estou conectado no servidor via Putty utilizando a porta 2222
[/quote]

Vou fazer uma pergunta séria. Se você der o seguinte comando pelo Windows (em um Prompt de Comando; talvez tenha de instalar o telnet.exe)

telnet id.do.meu.servidor 60001

O que ocorre?

a) Aparece uma tela preta quase instantaneamente. Talvez apareça alguma sujeira. Talvez, depois de algum tempo, a tela feche sozinha.
b) O telnet fica preso, tentando se conectar. Ou então ele mostra uma mensagem parecida com a seguinte:

Conectando-se a id.do.meu.servidor...Não foi possível abrir conexão com host na porta 60001
: conexão falhou

Se for o caso “b”, então verifique se o firewall do Windows está habilitado para você poder conectar-se a outra máquina pela porta 60001.
Se for o caso “a”, não haveria porque seu programa não funcionar direito.

Acho que é o caso “b”. Se for isso, cheque a conectividade da sua máquina para o tal servidor que atende na 60001.

[/quote]

Hmmm… valeu thingol! no meu caso deu a “b”… vou dar uma mexida no firewall aqui e ver se o telnet responde como deveria, qualquer novidade eu volto a postar.

Obrigado pela atenção!

Após mais outros testes, eu descidi executar minha classe diretamente no servidor felizmente rodou sem gerar a exceção, e depois que estiver rodando eu me preocuparei de como rodar na minha máquina…
No código abaixo ele roda normalmente na porta 60001 com o localhost, só que se eu descomentar a parte comentada ele não roda… acho que não devo estar enviando o XML corretamente pelo InputStream e OutputStream, alguma dica?

[code]import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;

public class ServerConnection {
public ServerConnection() {
try {
Socket socket = new Socket(“localhost”, 60001);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();

		byte[] xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <BotMessage messageType=\"Request\"> <UUID value=\"16o6u9a2-d768-4a99-bfe6-d76535abc234\"/> <param name=\"RequestType\" value=\"INFO\"/> <param name=\"InfoMethod\" value=\"1:aboutus\"/> <param name=\"Domain\" value=\"teste\"/> </BotMessage>"
				.getBytes();

		//out.write(xml);
		//System.out.println(in.read(xml));

		in.close();
		out.close();
		socket.close();
		System.out.println("done!");
	} catch (Exception e) {
		e.printStackTrace();
	}
}

public static void main(String[] args) {
	new ServerConnection();
}

}[/code]

Obrigado!