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?
cara,
como vc pode ver no cliente, é so vc dar um println.
t+
[quote=alissonvla]cara,
como vc pode ver no cliente, é so vc dar um println.
t+[/quote]
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.
sim cara,
vc vai fazer isso aqui
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class Cliente {
public static void main(String[] args) {
//Declaro o socket cliente
Socket s = null;
//Declaro a Stream de saida de dados
PrintStream ps = null;
try{
//Cria o socket com o recurso desejado na porta especificada
s = new Socket("127.0.0.1",7000);
//Cria a Stream de saida de dados
ps = new PrintStream(s.getOutputStream());
//Imprime uma linha para a stream de saída de dados
ps.println("CXXXX;YYYYYYYY#");
//Trata possíveis exceções
}catch(IOException e){
System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
}finally{
try{
//Encerra o socket cliente
s.close();
}catch(IOException e){}
}
}
}
t+
[quote=alissonvla]sim cara,
vc vai fazer isso aqui
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class Cliente {
public static void main(String[] args) {
//Declaro o socket cliente
Socket s = null;
//Declaro a Stream de saida de dados
PrintStream ps = null;
try{
//Cria o socket com o recurso desejado na porta especificada
s = new Socket("127.0.0.1",7000);
//Cria a Stream de saida de dados
ps = new PrintStream(s.getOutputStream());
//Imprime uma linha para a stream de saída de dados
ps.println("CXXXX;YYYYYYYY#");
//Trata possíveis exceções
}catch(IOException e){
System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
}finally{
try{
//Encerra o socket cliente
s.close();
}catch(IOException e){}
}
}
}
t+[/quote]
Fiz como no seu exemplo e quando executo fica só fica carregando, não dá mensagem de erro nem continua, fica carregando eternamente.
vc inicou sua aplicação servidor??
t+
[quote=alissonvla]vc inicou sua aplicação servidor??
t+[/quote]
Sim, mudei o código e fiz igual a um exemplo de um artigo no guj.
[code]ServerSocket serv=null;
//Declaro o Socket de comunicação
Socket s= null;
//Declaro o leitor para a entrada de dados
BufferedReader entrada=null;
try{
//Cria o ServerSocket na porta 7000 se estiver disponível
serv = new ServerSocket(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 = new BufferedReader(new InputStreamReader(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(IOException e){
//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(IOException e){
}
}
[/code]
cara,
fiz um teste aqui e funcionou,
[quote=alissonvla]cara,
fiz um teste aqui e funcionou, [/quote]
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”.
cara,
vc tem que fazer o seguinte, iniciar o servidor primeiro
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Servidor {
public static void main(String[] args) {
ServerSocket serv = null;
// Declaro o Socket de comunicação
Socket s = null;
// Declaro o leitor para a entrada de dados
BufferedReader entrada = null;
try {
// Cria o ServerSocket na porta 7000 se estiver disponível
serv = new ServerSocket(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 = new BufferedReader(new InputStreamReader(
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 (IOException e) {
// 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 (IOException e) {
}
}
}
}
e depois vc so iniciar a classe cliente
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class Cliente {
public static void main(String[] args) {
//Declaro o socket cliente
Socket s = null;
//Declaro a Stream de saida de dados
PrintStream ps = null;
try{
//Cria o socket com o recurso desejado na porta especificada
s = new Socket("127.0.0.1",7000);
//Cria a Stream de saida de dados
ps = new PrintStream(s.getOutputStream());
//Imprime uma linha para a stream de saída de dados
ps.println("CXXXX;YYYYYYYY#");
//Trata possíveis exceções
}catch(IOException e){
System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
}finally{
try{
//Encerra o socket cliente
s.close();
}catch(IOException e){}
}
}
}
aqui funcionou perfeito,
t+
Seguindo o que você passou:
Classe Servidor
public class SocketServidor {
public void servidor() {
ServerSocket serv = null;
Socket s = null;
try {
serv = new ServerSocket(7000);
s = serv.accept();
}
catch (IOException e) {
System.out.println("Algum problema ocorreu para criar ou receber o socket.");
}
finally {
try {
s.close();
serv.close();
}
catch (IOException e) {
}
}
}
}
Agora eu crio um objeto do tipo da classe Servidor para abrir uma conexão na porta 7000.
SocketServidor socket = new SocketServidor();
socket.servidor();
Veja o erro:
run:
Algum problema ocorreu para criar ou receber o socket.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at SocketServidor.servidor(SocketServidor.java:21)
at Janela1C2.jButton5ActionPerformed(Janela1C2.java:411)
at Janela1C2.access$500(Janela1C2.java:12)
at Janela1C2$6.actionPerformed(Janela1C2.java:277)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Tentei criar uma conexão na porta 7000, caso eu mude para a porta 8000 por exemplo a aplicação trava.
cara,
vc ja copiou esse exemplo que eu te passei e testou, vc vai ver que ele vai funcionar.
t+
[quote=alissonvla]cara,
vc ja copiou esse exemplo que eu te passei e testou, vc vai ver que ele vai funcionar.
t+[/quote]
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.
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 uma olhada nesse link, http://www.kodejava.org/examples/216.html
t+
[quote=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 uma olhada nesse link, http://www.kodejava.org/examples/216.html
t+[/quote]
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.
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+
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.
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?
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+
[quote=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+[/quote]
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?