Enviando XML para um Servidor na porta 60001

7 respostas
G

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

7 Respostas

T

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.

G
thingol:
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)
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();
	}
}

Obrigado!

T

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.

G

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.

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.

T

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.

G

thingol:

só que estou conectado no servidor via Putty utilizando a porta 2222

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.

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!

G

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?

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();
	}
}

Obrigado!

Criado 2 de junho de 2009
Ultima resposta 2 de jun. de 2009
Respostas 7
Participantes 2