Problema consumindo socket

4 respostas
luisbizzan

Boa tarde, estou tentando consumir um sockect onde o server é em Delphi e o cliente é em Java. O grande problema é que quando insiro um breakpoint no código e debugo ele executa normalmente, e quando removo ele não executa. Parece que não está esperando o tempo da conexão para enviar a resposta. Abaixo segue o código da minha classe:

public class SocketClient {
    private String url = "";
    private String port = "";

    public SocketClient(Global gb) throws Exception{
        url = Query.sLookUp(ControleServ.getPropertyAplication("ParametrosDoSistema"), "valorparamsis", "nomeparamsis = 'URLSocket'", gb.getSt()).trim();
        port = Query.sLookUp(ControleServ.getPropertyAplication("ParametrosDoSistema"), "valorparamsis", "nomeparamsis = 'PortSocket'", gb.getSt()).trim();
        if(url.isEmpty())throw new Exception("O Parâmetro 'URLSocket' não foi encontrado!");
        if(port.isEmpty())throw new Exception("O Parâmetro 'PortSocket' não foi encontrado!");
    }

    public String servico(String parametros) throws Exception{
        String caminho = "";       
        Socket socket = new Socket (url, Integer.parseInt(port));
        socket.setKeepAlive(true);

        boolean sConn = socket.isConnected();
        if(sConn){
            /*Passando parâmetros para o socket*/
            DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());
            /*Recebendo resposta do socket*/
            InputStreamReader isr = new InputStreamReader(socket.getInputStream());
            BufferedReader brd = new BufferedReader(isr);
            //DataInputStream istream = new DataInputStream(socket.getInputStream());

            ostream.writeBytes(parametros);
            ostream.flush();

            //caminho = brd.readLine();

            boolean loop = true;
            StringBuilder sb = new StringBuilder(8096);
            while (loop) {
                if (brd.ready()) {
                    int i = 0;
                    while (i != -1) {
                        i = brd.read();
                        sb.append((char) i);
                    }
                    loop = false;
                }else
                    loop = true;
            }
            caminho = sb.toString();

            socket.close();
        }
        return caminho;
    }
}

Se alguem puder me dar um auxilio ai, agradeço !!!

4 Respostas

E
  1. Não use “ready” com sockets, não faz o que você está imaginando :frowning:
  2. Sockets trafegam bytes, não caracteres, cuidado com isso (por exemplo, você precisa tomar muito cuidado em Java quando você tem um protocolo baseado em texto.)
luisbizzan

Bom pelo que eu intendi q vc mencionou, o ready não é muito utilizado, eu fiz isso pois estava achando que a resposta do socket estava demorando para ser entregue e eu ficava na espera. Antes eu estava utilizando caminho = brd.readLine(); mas mesmo assim ele demora no consumo da resposta. Tem uma outra alternativa ?
Sobre oque vc mencionou sobre trafego de bytes, eu já utilizei DataInputStream istream = new DataInputStream(socket.getInputStream()); ao invés de InputStreamReader isr = new InputStreamReader(socket.getInputStream()); BufferedReader brd = new BufferedReader(isr); mas tambem não funcionou tem alguma ideia ?

aloha

Para você descobrir o que está havendo quando não está debugando, você poderia implementar logs para “debugar” via console.

Onde achar necessário, utilize o System.out.println() para imprimir os valores das variáveis. Um ponto importante é aqui:

boolean loop = true;  
            StringBuilder sb = new StringBuilder(8096);  
            while (loop) {  
System.out.println(brd.ready());
                if (brd.ready()) {  
                    int i = 0;  
                    while (i != -1) {  
                        i = brd.read();  
System.out.println(i);
                        sb.append((char) i);  
                    }  
                    loop = false;  
                }else  
                    loop = true;  
            }
luisbizzan
Cara sabe oque tive que fazer para dar certo? Mais isso é gambiarra !!! Queria saber se alguém tem uma ideia ?
public class SocketClient {
    private String url = "";
    private String port = "";
    private Socket socket = null;

    public SocketClient(Global gb) throws Exception{
        url = Query.sLookUp(ControleServ.getPropertyAplication("ParametrosDoSistema"), "valorparamsis", "nomeparamsis = 'URLSocket'", gb.getSt()).trim();
        port = Query.sLookUp(ControleServ.getPropertyAplication("ParametrosDoSistema"), "valorparamsis", "nomeparamsis = 'PortSocket'", gb.getSt()).trim();
        if(url.isEmpty())throw new Exception("O Parâmetro 'URLSocket' não foi encontrado!");
        if(port.isEmpty())throw new Exception("O Parâmetro 'PortSocket' não foi encontrado!");
        socket = new Socket (url, Integer.parseInt(port));
[b]
        /*Aqui esta a gambiarra*/
        Thread.sleep(5*1000);
[/b]
        System.out.println("Socket");

    }

    public String servico(String parametros) throws Exception{
        String caminho = "";
        
        socket.setKeepAlive(true);
        System.out.println("KeepAlive");
        boolean sConn = socket.isConnected();
        System.out.println("Variavel Connected");
        if(sConn){
            /*Passando parâmetros para o socket*/
            DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());
            System.out.println("DataOutputStream");

            /*Recebendo resposta do socket*/
            InputStreamReader isr = new InputStreamReader(socket.getInputStream());
            System.out.println("InputStreamReader");
            BufferedReader brd = new BufferedReader(isr);
            System.out.println("BufferedReader");
            //DataInputStream istream = new DataInputStream(socket.getInputStream());
            
            System.out.println("lendo Conectado");
            String cmd = buscaCampo(brd);
            while(!"conectado".equals(cmd)){
                cmd = buscaCampo(brd);
            }
            System.out.println("Passando Parametros");
            ostream.writeBytes(parametros);
            ostream.flush();

            System.out.println("Lendo retorno");
            caminho = brd.readLine();
            System.out.println("Caminho:"+caminho);
            
            brd.close();
            isr.close();
            ostream.close();
            socket.close();
        }
        return caminho;
    }
    public String buscaCampo(BufferedReader brd) throws IOException{
        boolean loop = true;
        StringBuilder sb = new StringBuilder(8096);
        while (loop) {
            if (brd.ready()) {
                int i = 0;
                while (i != -1) {
                    i = brd.read();
                    sb.append((char) i);
                }
                loop = false;
            }else
                loop = true;
        }
        return sb.toString();
    }
}

Onde esta em negrito, se eu tiro o sleep parece, que o servidor não consegue conectar e ja receber meu parametro, assim ele da um tempo de conexao e depois ja recebe.

Alguem tem alguma ideia

Criado 14 de março de 2013
Ultima resposta 25 de mar. de 2013
Respostas 4
Participantes 3