Dúvida em socket(RESOLVIDO)

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?