Como ler e escrever sockets de rede em Java ME em um dispositivo com conectividade simplex?

votos
4

Eu estou trabalhando em um comunicador móvel e depois de estabelecer conexão com o servidor usando o método a seguir (para ilustrar que estou usando StreamConnection , InputStream e OutputStream ) Eu distribuo inputStream e outputStream entre dois segmentos separados, vamos chamá-los Sender e Receiver .

Método de conexão:

private InputStream inputStream;
private OutputStream outputStream;
private StreamConnection connection;

    public void connect(String host, String port) throws IOException {

        String connectionString = socket:// + host + : + port;
        connection = (StreamConnection) Connector.open(connectionString);

        inputStream = connection.openDataInputStream();
        outputStream = connection.openOutputStream();
    }

Sender thread está à espera de qualquer coisa que apareça no tampão fora. Quando o buffer de saída está vazia, remetente esperas (chamando wait()método em linha remetente). Qualquer entrada para o buffer de saída chama notify()método no segmento de envio.

Receptor urnas rosca do InputStream usando int available()método e quando há algo para receber, ele chama o bloqueio int read()método. Tudo funciona como um encanto em vários emuladores e alguns devicdes tenho acessível ao redor.

No entanto, há um telefone que parece missbehave. Sempre que um chamadas de rosca available()ou read()na InputThread objeto, enquanto o outro thread chama write()no OutputStream objeto, o fluxo de entrada acabamentos. Todos leituras subsequentes irá retornar o valor -1 , o que significa que o InputStream foi fechado.

Após maciça google-fu, eu deparei com este post em fóruns nokia , onde as propriedades simplex / duplex de um dispositivo estão sendo discutidos e que parece ser o caso com o dispositivo I tem problemas com. Normalmente (99% do tempo) chama de ler () e write () pode ser simultânea sem problemas.

A minha pergunta é então: Alguém veio em problemas semelhantes? Como foi / você iria resolver a questão de um segmento de leitura de forma independente, enquanto outro está escrevendo de forma independente para a conexão estabelecida, de modo que eles não chamam read () ou disponível () ao chamar write ()?

Os ponteiros em todos os sentidos muito apreciada!

Publicado 10/03/2009 em 18:22
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Normalmente, muito pouco é garantida quando falamos de aplicações multi-threaded. Eu recomendaria usar um único segmento em seu aplicativo e tentar controlá-lo usando um único trabalhador. Alguns dispositivos têm problemas comportamentais e assim o que vemos em um dispositivo não aparecer para trabalhar em algum outro dispositivo.

Eu tenho trabalhado muito com jogos móveis onde um monte de animação tem de ser prestados sem comprometer a velocidade do jogo. Eu percebi que você pode fazer mais com uma única linha e torna a sua aplicação muito portátil (com quase sem alterações).

Se você está esperando para os fios para completar qualquer leitura ou gravação, então parece que você está realmente fazendo isso sequencialmente. Então, mais ou menos, as coisas seria complicado com mais de um segmento. Em vez disso, construiu um mecanismo de esperar para notificar, com base em algum fator predeterminado e permitir que o único segmento para ler ou gravar o fluxo de soquete. A comutação entre segmentos é uma operação muito dispendiosa, que este esquema. espero que isso responda sua pergunta.

Respondeu 17/06/2009 em 09:57
fonte usuário

votos
2

Entre esse tipo de dados filterning operadores de redes móveis problema e, a maioria dos desenvolvedores Java móveis usam o "http: //" protocolo em vez de "socket: //".

Claro, isso não significa usar conexão duplex mais e fazendo muitas solicitações GET e POST.

Longe do ideal, eu sei.

Respondeu 11/03/2009 em 20:13
fonte usuário

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