[RESOLVIDO]Serialização J2ME + PHP

Boa noite pessoal, minha situação é a seguinte:

Tenho uma aplicação J2ME que usa o httpconection para enviar os dados a uma página em PHP. Só que depois de alguma tempo enviando e recebendo dados é gerada a seguinte excessão:

Essa classe é usada para enviar dados no formato json para o PHP que as persiste em um banco.

java.io.IOException: Resource limit exceeded for TCP client sockets at com.sun.midp.io.j2me.socket.Protocol.open0(), bci=0 at com.sun.midp.io.j2me.socket.Protocol.connect(), bci=124 at com.sun.midp.io.j2me.socket.Protocol.open(), bci=125 at com.sun.midp.io.j2me.socket.Protocol.openPrim(), bci=4 at com.sun.midp.io.j2me.http.Protocol.createConnection(), bci=13 at com.sun.midp.io.j2me.http.Protocol.connect(), bci=115 at com.sun.midp.io.j2me.http.Protocol.streamConnect(), bci=20 at com.sun.midp.io.j2me.http.Protocol.startRequest(), bci=9 at com.sun.midp.io.j2me.http.Protocol.sendRequest(), bci=35 at com.sun.midp.io.j2me.http.Protocol.sendRequest(), bci=3 at com.sun.midp.io.j2me.http.Protocol.closeOutputStream(), bci=1 at com.sun.midp.io.BaseOutputStream.close(), bci=11 at java.io.DataOutputStream.close(), bci=12

Segue abaixo a classe que efetua a conexão e envia os dados:

[code]
package DAO;

import com.sun.lwuit.Dialog;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.rmi.ServerException;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

public class RemoteConnection {

private HttpConnection httpconn;
private String URL;

public  RemoteConnection(String Url){
   //seto o valor da propriedade
    URL = Url;
}

public void setURL(String URL) {
    this.URL = URL;
}

public String postdata(Vector dados) throws IOException{
    String result = "";//string que guardara o resultado
    DataOutputStream out = null;

    try {
        //cria uma nova conexao baseada no na url passada
        httpconn = (HttpConnection) Connector.open(URL,Connector.READ_WRITE);
        //seta o cabeçalho
        httpconn.setRequestProperty("IF-Modified-Since","20 Jan 2001 16:19:14 GMT");
        httpconn.setRequestProperty("User-Agent","Profile/MIDP-2.0 Confirguration/CLDC-1.0");
        httpconn.setRequestProperty("Content-Language", "en-CA");
        httpconn.setRequestProperty("Content-Type", "text/plain; charset=UTF-8");
        httpconn.setRequestProperty("Connection", "close");

        //altera o método de requisição para POST
        httpconn.setRequestMethod(HttpConnection.POST);

        //abre o canal de comunicaçao com o servidor
        out = httpconn.openDataOutputStream();

        //escreve todos os elementos do parâmetro vetor na conexão
        for(int lncont=0;lncont<dados.size();lncont++){
             out.writeUTF(dados.elementAt(lncont).toString().trim());
        }

            //informa o final da escrita dos dados na conexão
        try{
            out.flush();
        }catch(IOException ex){
            ex.printStackTrace();
            httpconn.close();
            out.close();
            throw new ServerException("Erro na comunicacao com o Servidor");
        }

        //solicito o status da conexão
        int status = httpconn.getResponseCode();

        //caso a conexão esteja aberta
        if (status==HttpConnection.HTTP_OK) {

            DataInputStream in = httpconn.openDataInputStream();

            //crio um buffer para receber o retorno da conexão
            StringBuffer buffer = new StringBuffer();

            //leio o retorno do servidor
            int ch;
            while( ( ch = in.read() ) != -1 ) {
                buffer.append( (char)ch );
            }//end while( ( ch = dis.read() ) != -1 ) {

            //converto o retorno d buffer em string
            result = buffer.toString();

            //se o retorno contiver a palavra erro lanço uma excessão
            if (result.indexOf("erro")!=-1){
                //copio o conteúdo após o delimitador, pois as mensagens são recebidas no formato:
                //"erro|mensagem a ser mostrada"
                String exMessage = result.substring(result.indexOf('|')+1, result.length());
               //fecho a conexão
                httpconn.close();

                throw new ServerException("Erro:\n"+exMessage);
            }
        }else{
            httpconn.close();
            throw new ServerException("Erro no servidor: "+status);
        }

        } catch (IOException ex) {
        ex.printStackTrace();
        try {
            httpconn.close();
        } catch (IOException ex1) {
            ex1.printStackTrace();
        }
        Dialog.show("Erro",ex.getMessage(),"OK",null);
    }
    try {
        httpconn.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return  result;
}

}[/code]

Alguém teria alguma idéia do que poderia ser?

Só para constar, todas as requisições feitas ao PHP são retornados resultados.

É preciso fechar streams e conexões não somente em caso de erro ou excessão. Mesmo dando tudo ok feche elas para não exceder o limite de sockets, que é a sua mensagem de erro.
depois do try/catch usa:
finally {
in.close();
}
finally {
httpconn.close();
}
um abraço.

Ok, isso resolveu parcialmente o problema , eu esqueci de citar que na verdade o erro está sendo disparado no comando out.flush(dataoutputstream), dai seguindo o raciocionio no finnaly eu coloquei pra fechar a conexão, daí acontece em algusn casos da conexão ser fechada antes de eu terminar de escrever. Existe alguma maneira de eu determinar se ainda exitem bytes a serem enviados ante de encerrar a escrita?

Muito obrigado cara, vc já me deu uma direção…

[quote=keyson] Existe alguma maneira de eu determinar se ainda exitem bytes a serem enviados ante de encerrar a escrita?
Muito obrigado cara, vc já me deu uma direção…[/quote]

Sim, dentro do finally{} você use um if ( … != null) para testar se a conexão e stream já encerraram.

OK ok, funcionou… muito obrigado, resolvido.

Uma última pergunta só por curiosidade, eu testei a conexão sem o flush do dataoutputstream e funcionou, (se bem que eu o coloquei de volta), então no final das contas qual a função do método flush do dataoutputstream…?

É bom que fica de exemplo para outros usuários…

[quote=keyson]OK ok, funcionou… muito obrigado, resolvido.

Uma última pergunta só por curiosidade, eu testei a conexão sem o flush do dataoutputstream e funcionou, (se bem que eu o coloquei de volta), então no final das contas qual a função do método flush do dataoutputstream…?

É bom que fica de exemplo para outros usuários…[/quote]

Não sei detalhar didaticamente, mas ele é uma garantia de que todo byte que entrou no fluxo seja destinado corretamente, sem ele pode dar certo, mas ele certifica que dê certo. Mais ou menos por ai.

Obrigado pelo reconhecimento, geralmente no máximo rola um “vlw”