Pergunta

Estou tentando desenvolver um cliente TCP que seja executado em dispositivos móveis usando o MIDP 2.0 e o CLDC 1.1. Estou tentando um código de exemplo e tenho o seguinte problema:

Tenho uma exceção estranha quando tento ler os dados de volta (do meio).

Este é o meu código:

            //Wait for an incoming message
            firstByte = in.read();
            ByteArrayOutputStream textRecieved = new ByteArrayOutputStream();   //Will be used to hold the data
            if (firstByte >= 0 )
            {                    
                int messageSize = this.in.available();

                //Read the message
                while (messageSize > 0)
                {
                    byte[] buffer = new byte[messageSize];  
                    this.in.read(buffer);
                    textRecieved.write(buffer);
                    messageSize = this.in.available();   //Just in case the server sent the request in chunks.
                    System.out.println("Reading...");
                }
            }
            textRecieved.close();

Esta é a exceção que recebo:

java.io.IOException: Unknown error 10053 during socket::read 
        at com.sun.midp.io.j2me.socket.Protocol.read0(), bci=0
        at com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(), bci=12
        at com.sun.midp.io.BufferedConnectionAdapter.readBytes(), bci=36
        at com.sun.midp.io.BaseInputStream.read(), bci=227
        at com.sun.midp.io.BufferedInputStream.fill(), bci=172
        at com.sun.midp.io.BufferedInputStream.read(), bci=16
        at hello.Client.run22222(Client.java:60)
        at hello.HelloMIDlet.startApp(HelloMIDlet.java:193)
        at javax.microedition.midlet.MIDletTunnelImpl.callStartApp(), bci=1
        at com.sun.midp.midlet.MIDletPeer.startApp(), bci=7
        at com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=269
        at com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
        at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
        at com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
        at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

A linha que causa a exceção é a seguinte:

firstByte = in.read();

Estou lendo em um tópico separado. Eu experimentei o mesmo erro quando enviei solicitações e tentei lê -las usando o mesmo servidor. O servidor é um servidor de eco simples, nada complexo.

PS Eu sei que a maneira como o código é escrito se parece com C#, mas é Java, acho mais fácil ler e seguir dessa maneira.

Obrigado.

Foi útil?

Solução 2

Este exemplo parece estar funcionando:http://www.java-samples.com/j2me/socket-connection-free-j2me-sample-program.htm

Será que o problema era que eu estava implementando o cliente como uma classe chamada pelo meio?

Outras dicas

A primeira coisa que vejo é que você está usando mal available(). Provavelmente não Faça o que você espera que isso faça.

available() retorna uma estimativa. Seu javadoc continua declarando explicitamente o seguinte:

Nunca é correto usar o valor de retorno desse método para alocar um buffer destinado a manter todos os dados nesse fluxo.

Pode muito bem voltar 0, nesse caso, você aloca um buffer do tamanho 0 e tenta ler isso.

Em uma implementação em conformidade que deve retornar imediatamente e não ler nada, mas você pode facilmente desencadear um bug em uma implementação menos do que perfeita com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top