uma coisa que tive que resolver a pouco tempo, foi como fazer comunicação entre dois midlets (rodando no mesmo celular), tentei usar TCP dava erro no tcp get bind info (necessita comunicação de dados com a operadora), ai descobri que a comunicação UDP não precisava do bind info, o que faz funcionar a comunicação entre eles funcionar corretamente (é o mais indicado para este tipo de cenário).
Mas como a maioria sabe a comunicação UDP tem limitação de tamanho do pacote (estava transmitindo um arquivo) e não há garantia dos pacotes serem recebidos na mesma ordem dos pacotes enviados, por isso criei um código que no início do pacote tem a quantidade de pacotes e o número do pacote. Com isso o cliente consegue remontar o arquivo corretamente.
Segue os códigos para J2ME
protected byte[] receiveUDP (DatagramConnection sc) throws IOException {
int posicao = 0;
int tamanho = 0;
byte qtid = 0;
byte id = 0;
byte [] result = null;
byte [] buffer = new byte [sc.getMaximumLength()];
Datagram dgram = sc.newDatagram(buffer, buffer.length);
do {
dgram.setLength(buffer.length);
sc.receive(dgram);
id = buffer[0];
if (qtid == 0) {
qtid = (byte)(buffer[1]-1);
result = new byte [buffer[1]*(sc.getMaximumLength()-2)];
} else {
--qtid;
}
posicao = id*(sc.getMaximumLength()-2);
for (int i = 2; i < dgram.getLength(); ++i) {
++tamanho;
result[posicao+i-2] = buffer[i];
}
} while (qtid > 0);
buffer = new byte[tamanho];
for (int i = 0; i < tamanho; ++i) {
buffer[i] = result [i];
}
return buffer;
}
===============================================================================
protected void sendUDP (DatagramConnection sc, byte [] bArquivo) throws IOException {
int posicao = 0;
int tamanho = 0;
byte [] buffer = new byte [sc.getMaximumLength()];
byte qtid = (byte) ((bArquivo.length-2)/sc.getMaximumLength());
if (((bArquivo.length-2) % sc.getMaximumLength()) > 0) {
++qtid;
}
for (byte id = 0; id < qtid; ++id) {
Datagram dgram = sc.newDatagram(buffer, buffer.length);
tamanho = 2;
buffer[0] = id;
buffer[1] = qtid;
if ((bArquivo.length-posicao) > (buffer.length-2)) {
tamanho = buffer.length;
} else {
tamanho = bArquivo.length-posicao+2;
}
dgram.setLength(tamanho);
for (int i = 0; i < (tamanho-2); ++i) {
buffer [i+2] = bArquivo [posicao];
++posicao;
}
sc.send(dgram);
}
}
Nenhum comentário:
Postar um comentário