[RESOLVIDO]Serialização J2ME + PHP

5 respostas
K

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:
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;
    }

}

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

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

5 Respostas

E
É 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.
K

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…

E

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…

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

K

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…

E

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…

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”

Criado 20 de maio de 2010
Ultima resposta 21 de mai. de 2010
Respostas 5
Participantes 2