Estou querendo fazer um socket para enviar uma informação via rede no seguinte formato:
CXXXX;YYYYYYYY#
c => Constante
XXXX => Informação a ser enviada
; => Constatnte Separador
YYYY => Informação a ser enviada
=> Constante Terminador
Dei uma olhada nesse artigo sobre socket e aprendi que preciso criar um objeto para abrir uma porta para conexão(server socket) e um para comunicação (socket). Mas como faço para enviar os dados via rede?
como vc pode ver no cliente, é so vc dar um println.
t+
P
Pedro_Ribeiro
alissonvla:
cara,
como vc pode ver no cliente, é so vc dar um println.
t+
Não amigo, eu vou enviar dados no formato acima para outra máquina, vou dar um println e vai ser enviado? Não entendi.
A
alissonvla
sim cara,
vc vai fazer isso aqui
importjava.io.IOException;importjava.io.PrintStream;importjava.net.Socket;publicclassCliente{publicstaticvoidmain(String[]args){//Declaro o socket cliente Sockets=null;//Declaro a Stream de saida de dados PrintStreamps=null;try{//Cria o socket com o recurso desejado na porta especificada s=newSocket("127.0.0.1",7000);//Cria a Stream de saida de dados ps=newPrintStream(s.getOutputStream());//Imprime uma linha para a stream de saída de dados ps.println("CXXXX;YYYYYYYY#");//Trata possíveis exceções }catch(IOExceptione){System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");}finally{try{//Encerra o socket cliente s.close();}catch(IOExceptione){}}}}
t+
P
Pedro_Ribeiro
alissonvla:
sim cara,
vc vai fazer isso aqui
importjava.io.IOException;importjava.io.PrintStream;importjava.net.Socket;publicclassCliente{publicstaticvoidmain(String[]args){//Declaro o socket cliente Sockets=null;//Declaro a Stream de saida de dados PrintStreamps=null;try{//Cria o socket com o recurso desejado na porta especificada s=newSocket("127.0.0.1",7000);//Cria a Stream de saida de dados ps=newPrintStream(s.getOutputStream());//Imprime uma linha para a stream de saída de dados ps.println("CXXXX;YYYYYYYY#");//Trata possíveis exceções }catch(IOExceptione){System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");}finally{try{//Encerra o socket cliente s.close();}catch(IOExceptione){}}}}
t+
Fiz como no seu exemplo e quando executo fica só fica carregando, não dá mensagem de erro nem continua, fica carregando eternamente.
A
alissonvla
vc inicou sua aplicação servidor??
t+
P
Pedro_Ribeiro
alissonvla:
vc inicou sua aplicação servidor??
t+
Sim, mudei o código e fiz igual a um exemplo de um artigo no guj.
ServerSocketserv=null;//Declaro o Socket de comunicação Sockets=null;//Declaro o leitor para a entrada de dados BufferedReaderentrada=null;try{//Cria o ServerSocket na porta 7000 se estiver disponível serv=newServerSocket(7000);//Aguarda uma conexão na porta especificada e cria retorna o socket que irá comunicar com o cliente s=serv.accept();//Cria um BufferedReader para o canal da stream de entrada de dados do socket s entrada=newBufferedReader(newInputStreamReader(s.getInputStream()));//Aguarda por algum dado e imprime a linha recebida quando recebe System.out.println(entrada.readLine());//trata possíveis excessões de input/output. Note que as excessões são as mesmas utilizadas para as classes de java.io }catch(IOExceptione){//Imprime uma notificação na saída padrão caso haja algo errado. System.out.println("Algum problema ocorreu para criar ou receber o socket.");}finally{try{//Encerro o socket de comunicação s.close();//Encerro o ServerSocket serv.close();}catch(IOExceptione){}}
A
alissonvla
cara,
fiz um teste aqui e funcionou,
P
Pedro_Ribeiro
alissonvla:
cara,
fiz um teste aqui e funcionou,
O meu aqui não funciona, até tentei mover o local onde eu instancio a classe do socket mas a aplicação trava. Alguém tem alguma ideia?
Edit:
Deixei o finally sem código e deu erro “Algum problema ocorreu para criar ou receber o socket”.
A
alissonvla
cara,
vc tem que fazer o seguinte, iniciar o servidor primeiro
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{publicstaticvoidmain(String[]args){ServerSocketserv=null;// Declaro o Socket de comunicaçãoSockets=null;// Declaro o leitor para a entrada de dadosBufferedReaderentrada=null;try{// Cria o ServerSocket na porta 7000 se estiver disponívelserv=newServerSocket(7000);// Aguarda uma conexão na porta especificada e cria retorna o socket// que irá comunicar com o clientes=serv.accept();// Cria um BufferedReader para o canal da stream de entrada de dados// do socket sentrada=newBufferedReader(newInputStreamReader(s.getInputStream()));// Aguarda por algum dado e imprime a linha recebida quando recebeSystem.out.println(entrada.readLine());// trata possíveis excessões de input/output. Note que as excessões// são as mesmas utilizadas para as classes de java.io}catch(IOExceptione){// Imprime uma notificação na saída padrão caso haja algo errado.System.out.println("Algum problema ocorreu para criar ou receber o socket.");}finally{try{// Encerro o socket de comunicaçãos.close();// Encerro o ServerSocketserv.close();}catch(IOExceptione){}}}}
e depois vc so iniciar a classe cliente
importjava.io.IOException;importjava.io.PrintStream;importjava.net.Socket;publicclassCliente{publicstaticvoidmain(String[]args){//Declaro o socket cliente Sockets=null;//Declaro a Stream de saida de dados PrintStreamps=null;try{//Cria o socket com o recurso desejado na porta especificada s=newSocket("127.0.0.1",7000);//Cria a Stream de saida de dados ps=newPrintStream(s.getOutputStream());//Imprime uma linha para a stream de saída de dados ps.println("CXXXX;YYYYYYYY#");//Trata possíveis exceções }catch(IOExceptione){System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");}finally{try{//Encerra o socket cliente s.close();}catch(IOExceptione){}}}}
aqui funcionou perfeito,
t+
P
Pedro_Ribeiro
Seguindo o que você passou:
Classe Servidor
publicclassSocketServidor{publicvoidservidor(){ServerSocketserv=null;Sockets=null;try{serv=newServerSocket(7000);s=serv.accept();}catch(IOExceptione){System.out.println("Algum problema ocorreu para criar ou receber o socket.");}finally{try{s.close();serv.close();}catch(IOExceptione){}}}}
Agora eu crio um objeto do tipo da classe Servidor para abrir uma conexão na porta 7000.
Tentei criar uma conexão na porta 7000, caso eu mude para a porta 8000 por exemplo a aplicação trava.
A
alissonvla
cara,
vc ja copiou esse exemplo que eu te passei e testou, vc vai ver que ele vai funcionar.
t+
P
Pedro_Ribeiro
alissonvla:
cara,
vc ja copiou esse exemplo que eu te passei e testou, vc vai ver que ele vai funcionar.
t+
Eu apenas tirei a opção de esperar algo ser digitado porque a minha aplicação sera um server, uma outra aplicação vai conectar na porta que eu abrir e receber informações da minha aplicação.
A
alissonvla
cara,
da aplicação server vc nao tem tirar nada, vc tem que acrescentar, por exemplo, um while(true), para ficar escutando todas as informações que a aplicacao cliente vai enviar.
da aplicação server vc nao tem tirar nada, vc tem que acrescentar, por exemplo, um while(true), para ficar escutando todas as informações que a aplicacao cliente vai enviar.
O que eu não entendo é o seguinte, se a minha aplicação desktop vai esperar uma conexão de uma aplicação web, pegar informações e enviar pra essa aplicação Web porque tenho que criar uma classe Cliente?
Essas 2 classes (servidor, cliente) são iniciadas apenas instanciando objetos do tipo, porque não entendi a comunicação entre as mesmas.
A
alissonvla
cara,
estou te passando um exemplo, nao quer dizer que vc vai ter que fazer assim, vc vai utilizar o conceito, pq nao vai fugir disso nao.
sua aplicação web, vai ser seu cliente e vc vai implentar uma outra aplicação que vai ser seu servidor.
t+
P
Pedro_Ribeiro
O código estava certo, o problema era que quando eu instanciava a classe servidor a aplicação esperava uma requisição cliente e por isso parava, não travava, assim que consegui uma aplicação cliente funcionou.
Vou deixar o tópico sem o resolvido por enquanto porque preciso deixar essa conexão sempre ativa, preciso fazer uma ponte entre o banco de dados, a aplicação delphi e a minha aplicação.
P
Pedro_Ribeiro
Estou com uma dúvida.
Quando eu abro o socket a aplicação delphi se conecta a minha aplicação java, caso eu feche o socket a aplicação delphi fecha a requisição e não tenta se conectar mais.
Nesse caso eu preciso apenas disparar instancias de objeto do tipo socket de 1 em 1 segundo fechando cada conexão ou simplesmente instancio um objeto socket e não fecho a conexão?
A
alissonvla
vc vai ter uma aplicação java rodando como server, ela vai ficar escutando tudo que chega naquela porta que vc definiu, e sua aplicação delphi vai criar o socket enviar os dados e fechar, pronto, e vc vai fazer isso de 1 em 1 segundo.
t+
P
Pedro_Ribeiro
alissonvla:
vc vai ter uma aplicação java rodando como server, ela vai ficar escutando tudo que chega naquela porta que vc definiu, e sua aplicação delphi vai criar o socket enviar os dados e fechar, pronto, e vc vai fazer isso de 1 em 1 segundo.
t+
Na verdade a aplicação java vai ser o server e enviar os dados.
Pelo que você falou as 2 aplicações vão ficar de 1 em 1 segundo abrindo e fechando sockets, é isso mesmo?
A
alissonvla
se sua aplicação java vai ser servidor, entao vc so consegue enviar dados, caso chega alguma informaçao no servidor.
por exemplo, a aplicação delphi cliente enviou dados para aplicacao java servidor, com isso ela vai receber os dados e ela pode enviar dados de volta.
t+
P
Pedro_Ribeiro
alissonvla:
se sua aplicação java vai ser servidor, entao vc so consegue enviar dados, caso chega alguma informaçao no servidor.
por exemplo, a aplicação delphi cliente enviou dados para aplicacao java servidor, com isso ela vai receber os dados e ela pode enviar dados de volta.
t+
Como está no momento é assim, eu instancio um objeto socket server e a aplicação aguarda uma requisição, recebeu a requisição envia os dados.
Acredito que se for configurado nas 2 aplicações para enviar enviar e receber sockets de 1 em 1 segundo vai funcionar.
A
alissonvla
cara,
explica melhor o que vc quer, pq acho que ta ficando confuso.
t+
P
Pedro_Ribeiro
alissonvla:
cara,
explica melhor o que vc quer, pq acho que ta ficando confuso.
t+
É assim, a aplicação delphi não fui eu que fiz, me foi passado pra desenvolver um socket como server, a aplicação delphi vai conectar no server java e o server vai enviar informações colhidas no banco.
Nos primeiros testes o desenvolvedor da aplicação delphi me disse que eu tenho que abrir o server primeiro, caso eu não abrir a aplicação delphi cancela a conexão socket e não tenta novamente.
A minha dúvida é como vou fazer pra funcionar corretamente.
Se eu faço uma instancia do objeto sever socket sem fechar o server.
Ou coloco instancio um server socket de 1 em 1 segundo fechando cada server.
A
alissonvla
agora entendi o que vc quer,
http://www.kodejava.org/examples/216.html, ve nesse link e implementa a parte como ele o servidor, vc vai roda-la e deixa rodando, quem vai ser responsavel por enviar os dados é delphi, basta vc implentar a logica para gravar no banco.
t+
P
Pedro_Ribeiro
alissonvla:
agora entendi o que vc quer,
http://www.kodejava.org/examples/216.html, ve nesse link e implementa a parte como ele o servidor, vc vai roda-la e deixa rodando, quem vai ser responsavel por enviar os dados é delphi, basta vc implentar a logica para gravar no banco.
t+
Depois de alguns dias tentando finalizei o socket pegando um pouco da ideia do link acima, obrigado.