Networking problema em Java ME

votos
0

Ok, então eu estou usando Java ME para conectar a um script PHP no meu servidor, mas por algum motivo estranho a rede só irá funcionar a primeira vez que o aplicativo é executado no telefone após a instalação. Qualquer outro momento, ela não vai mesmo pedir permissão para usar a rede. Aqui está o método em questão:

private static String defaultURL = http://www.roostercogburn.co.uk/proj/uploadScript.php;


public static String upload(String requeststring) {
    HttpConnection hc = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;
    StringBuffer messagebuffer = new StringBuffer();
    requeststring = xml= + requeststring;
    try {
        // Open up a http connection with the Web server
        // for both send and receive operations
        hc = (HttpConnection) Connector.open(defaultURL, Connector.READ_WRITE);
        // Set the request method to POST
        hc.setRequestMethod(HttpConnection.POST);
        // Send the string entered by user byte by byte
        dos = hc.openDataOutputStream();
        byte[] request_body = requeststring.getBytes();
        for (int i = 0; i < request_body.length; i++) {
            dos.writeByte(request_body[i]);
        }
        dos.flush();
        dos.close();
        // Retrieve the response back from the servlet
        dis = new DataInputStream(hc.openInputStream());
        int ch;
        // Check the Content-Length first
        long len = hc.getLength();
        if (len != -1) {
            for (int i = 0; i < len; i++) {
                if ((ch = dis.read()) != -1) {
                    messagebuffer.append((char) ch);
                }
            }
        } else {
            // if the content-length is not available
            while ((ch = dis.read()) != -1) {
                messagebuffer.append((char) ch);
            }
        }

        dis.close();

        hc.close();
    } catch (IOException ioe) {
        messagebuffer = new StringBuffer(ERROR!);
    } finally {
        // Free up i/o streams and http connection
        try {
            if (hc != null) {
                hc.close();
            }
        } catch (IOException ignored) {
        }
        try {
            if (dis != null) {
                dis.close();
            }
        } catch (IOException ignored) {
        }
        try {
            if (dos != null) {
                dos.close();
            }
        } catch (IOException ignored) {
        }
    }
    return messagebuffer.toString();
}

Alguma ideia?

Publicado 06/02/2009 em 14:30
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

Eu tenho alguns comentários a fazer sobre o código. Eu chamaria getResponseCode imediatamente depois de fechar o fluxo de saída e verificar o código de resposta http antes de abrir o fluxo de entrada. Mais importante, porém, gostaria de mover todos os fecha para o bloco finally. Agora, se você tem uma exceção no código que você pode deixar a instância HttpConnection aberto, o que pode interferir com as tentativas posteriores para se conectar.

Respondeu 06/02/2011 em 14:57
fonte usuário

votos
0

O uso de "estática" me lembra que as máquinas virtuais JavaME geralmente não descarregar classes.

Eu sei que pelo menos a plataforma Series40 deixa o processo VM rodando o tempo todo variáveis ​​tão estáticas não são repostos e código de inicialização estática é executado apenas uma vez.

Tente desligar o telefone e para certificar-se de que você não está correndo para esta questão.

Caso contrário, talvez postar todo o código de um MIDlet simples que você usar esse código em e diga-nos o que handsets você já tentou-lo.

Você também pode usar o log (arquivo ou saída padrão) para garantir que o método de upload realmente está sendo executado pela segunda vez (ou descobrir por que ele não faz)

Respondeu 09/02/2009 em 19:12
fonte usuário

votos
0

Para mim, este código não parece ser o problema. Criado um MIDlet teste rápido e tudo funcionou no emulador e SonyEricsson W960.

Minha forma de teste:

class TestForm extends Form implements CommandListener, Runnable {
  private final Command exit = new Command("Exit", Command.EXIT, 0);
  private final Command run = new Command("Run", Command.OK, 0);
  private int testRunCount;

  public TestForm() {
    super("Test");
    addCommand(exit);
    addCommand(run);
    setCommandListener(this);
  }

  public void commandAction(final Command cmd, final Displayable d) {
    if (cmd == exit) {
      notifyDestroyed();
    } else if (cmd == run) {
      final Thread t = new Thread(this);
      t.start();
    }
  }

  public void run() {
    testRunCount++;
    append("Test run " + testRunCount + "\n");
    final String result = upload("StackOverflow testrun " + testRunCount);
    append("Result > " + result + "\n");
  }
}

BTW:

Qualquer outro momento, ela não vai mesmo pedir permissão para usar a rede

Não há nenhuma exigência para perguntar o tempo todo. Em telefones / emuladores geralmente permissão só é colocada uma vez por executar a aplicação.

Verifique se este método é até chamado após a chamada inicial :)

Respondeu 06/02/2009 em 19:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more