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();
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?
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.
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?
public class ServerConnection {
public ServerConnection() {
try {
Socket socket = new Socket(“localhost”, 60001);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();