Problema com timeout em conexão por socket

Olá. Estou implementando um aplicativo em j2me MIDP-2.0 CLDC-1.1, que faz conexão via socket com um servidor para realizar downloads. Encontrei vários problemas que talvez estejam relacionados ou não:

  1. Tenho que ler todos os bytes do input stream da conexão, para isso utilizo um buffer (byte[]). Em cada iteração eu leio alguns bytes e jogo no buffer. Este buffer tive que limitar para tamanho 75, pois maior que isso faz que eu perca bytes por a conexão se fechar prematuramente.

  2. Entre cada leitura do buffer, tenho que dar um delay de 20 milissegundos, senão novamente a conexão é fechada antes de terminar de ler todos os bytes.

  3. Eu recebo um timeout do servidor depois de cerca de 1 minuto, sendo que não é o suficiente para baixar todos os dados, em parte por causa dos dois itens anteriores.

A transmissão de dados fica muito lenta, e o que é pior, o timeout não permite que eu faça download de arquivos muito grandes. Alguém saberia me orientar ou sugerir o que fazer? Coloquei abaixo trechos simplificados do código que uso para abrir a conexão e ler do input stream.


    private SocketConnection createConnection() throws Exception {

        conn = (SocketConnection)Connector.open( "socket://"+server+":"+port );
        conn.setSocketOption(SocketConnection.DELAY, 0);
        conn.setSocketOption(SocketConnection.LINGER, 0);
        conn.setSocketOption(SocketConnection.KEEPALIVE, 1);
        conn.setSocketOption(SocketConnection.RCVBUF, 1024);
        conn.setSocketOption(SocketConnection.SNDBUF, 512);

        return conn;
    }



    public void run() {

        int bufSize = 75;

        try {
            conn = createConnection();
            os = conn.openOutputStream();

            os.write(getRequestHeader().getBytes());
            os.flush();

            is = conn.openInputStream();

            byte[] vet = new byte[bufSize];

            while(true) {

                int count = is.read(vet,0,bufSize); // read some bytes

                if( count < 1 ) {
                    break;
                }

                // Neste momento eu uso os bytes lidos.
                // Apaguei este pedaço de código pois não é pertinente para o problema.

                if( is.available() == 0 ) {
                    break;
                }

                try {
                    Thread.sleep(20);
                }
                catch( Exception e ) {
                    e.printStackTrace();
                }
            }

        }
        catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        catch (ConnectionNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (SecurityException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }