Socket - Receber String Através de Socket

3 respostas
kanofe

Caros Amigos
Estou com o seguinte problema.
Estou trabalhando com socket agora em java, estou migrando aplicações feitas em delphi pra java.
Tenho um aplicação que me retorna uma String Criptograda, de tamanho variavel.
Ou seja, dependendo da informação enviada, o retorno tem um tamanho variavel.
Estou com dificuldade quando essa String (Informação) é muito grande.
Para maior controle, e para poder Descriptografar a informação, mando (recebo) o tamanho da String logo nos primieros Bytes dela.
Mas quando tento Descriptografar elá esta menos do que o Byte de controle mostra.
Gostaria de saber se tem algum metodo de verificar se tda a minha String veio, ou poder informar um tamanho maximo dela.
Pois se informar o tamanho maximo, mesmo ela vindo menor eu consigo fazer a leitura e descriptografia pelo Byte de Controle que vem junto a ela.
Segue abaixo o Codigo que uso para enviar a informação e receber a String do Server

public String EnvSocket(String mens) {
        try {
            Socket socket = new Socket("10.11.0.30",10642);
            String rec=null;
            if(socket.isConnected()) {
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));               
                System.out.println("Mens:"+mens);
                //out.writeUTF(mens); Tentei usando dessa forma a Informação chega errada do Server (Delphi)
                out.writeBytes(mens);                                              
                String recebido = in.readLine();
                System.out.println("Rec: "+recebido);
                rec= Func.ConfMensagem(recebido,true); //DesCriptografa No inicio da String tem o tamanho
                System.out.println("Conf: "+rec);
                socket.shutdownOutput();
                socket.shutdownInput();
                in.close();
                out.close();
                socket.close();
                return rec;
            }
            return "Não foi Possivel Conectar";
        } catch (java.io.EOFException eo) {
            return "EOFException";
        }catch(IOException eio){
            return "IOException";
        }
    }

Também gostaria de saber se da forma que estou fazendo, esta correto ou tem alguma outra forma usando outros metodos.

Obrigado a todos.

3 Respostas

vanderlanio

tem exepton ?
Qual o real problema ?
o Server esta realmento mandado a informação correta ?

kanofe

Nao Gera Exception
Inclusive testo se vem EOF (EOFException)

O problema é que a String que recebo do Server é menor que a informada no Byte de Controle

Sim o Server esta mandando a Informação correta, pois jah utilizo ele com Delphi

O que acho que pode estar acontecendo é que o Server me retorna a String, e ela vem quebrada. (Vem faltando dados)
Pois como eu falei, ele me retorna diversas String de diversos Tamanhos, e quando essa String é maior ou seja ela nao chega toda.
Tenho em media 3 diferentes tamanhos de String sendo que o maior é de 2048 Bytes.

kanofe

Pessoal Recebi um post de outro forum
de auxilio da uma olhada como fiz e tbm segue o link do post
http://www.javafree.org/javabb/viewtopic.jbb?t=867941&page=1#151496
Abaixo o Exemplo que me ajudou a solucionar o problema

byte[] buff = new byte[2048+10];  // um pouco de reserva, to com preguica de fazer variavel   
InputStream in = socket.getInputStream();   
int len = in.read(buff);  // espero receber tudo de uma vez   
if (len < 2) {   
    // erro   
}   
int tamanho = ((buff[0] & 0xFF) << 8) + (buff[1] & 0xFF);  // supondo BigEndian (byte mais significativo primeiro)   
if (len - 2 != tamanho) {   
    // erro ?   
}

Obrigado a todos
[]'s

Criado 10 de abril de 2008
Ultima resposta 11 de abr. de 2008
Respostas 3
Participantes 2