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:
-
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.
-
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.
-
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();
}
}