У меня есть приложение для Android, которое контролирует UDP-пакеты и вызывает метод обработки полученного сообщения. У меня есть одна проблема, если входящее сообщение длиннее, это вызовет метод для обработки сообщения. Но если входящее сообщение короче, он не вызовет этот метод, но если я отправлю короткое сообщение дважды, он обработает или сразу отправит короткое сообщение после того, как длинное сообщение будет обработано. Как я могу это исправить? Мне нужно обрабатывать короткие и длинные сообщения.Android UDP-пакеты, как получать пакеты с переменным размером
Код приема UDP, который вызывает метод для длинного сообщения, но не для короткого сообщения;
class Server extends Thread {
@Override
public void run() {
try {
int port = 8888;
// Create a socket to listen on the port.
dsocket = new DatagramSocket(port);
// Create a buffer to read datagrams into.
byte[] buffer = new byte[100];
// Create a packet to receive data into the buffer
DatagramPacket packet = new DatagramPacket(buffer, uffer.length);
while (true) {
try {
// Wait to receive a datagram
dsocket.receive(packet);
//Convert the contents to a string,
String msg = new String(buffer, packet.getOffset(), packet.getLength());
if (msg !=null)
{
call(msg);
msg=null;
}
// Reset the length of the packet before reusing it.
packet.setLength(buffer.length);
} catch (Exception e) {
dsocket.close();
break; }
}
} catch (Exception e) {
dsocket.close(); e.printStackTrace();}
}
}
public void call(String mg) {
int v;
int sq=0; // store squence no of the calls
int indxs=0; // start alarm msg index
boolean fnd; // alarm msg filter flg
char Sqchar1; // squnce no of the call
char Sqchar2; // squnce no of the call
char Sqchar3; // squnce no of the call
int pospri; // default position 8 of priority for one digit seqence no
String pstr = null; // alarm msg string without filter
boolean aflg =false; // alarm msg found flg becomes true
boolean retval = false; // stop same active sequence msg
int sqnum; // defualt sq to one digit
int lstr = mg.length();
int indxe= lstr; // end alarm msg index
// typica string mg = 145 ($\M A 1 5 "bla bla")// valid alarm msg
// typical string mg = 88 ($\M A 12 6 "bla bla")// valid alarm msg
// typical string mg = 127 ($\M A 123 1 "bla bla")// valid alarm msg
// typical string mg = 1111 ($\M A 130 2 "bla bla")// valid alarm msg
// typical string mg = 148 ($\M N 1)// valid CANCEL msg
// typical string mg = 90 ($\M N 12)// valid CANCEL msg
// typical string mg = 130 ($\M N 123)// valid CANCEL msg
// typical string mg = 1115 ($\M N 130)// valid CANCEL msg
// NON Valid string mg = 456
// NON Valid string mg = 113 ($\C x n " bla bla")
//serach for alarm string
for(int i=0; i< lstr; i++)
{
char schar = mg.charAt(i);
if(schar=='$')
{
rHandler.post(rRunnable);
pstr = mg.substring(i, (lstr-1));
aflg =true; break;
}
}
if(aflg)
{
char achar = pstr.charAt(2); // indicateas alarm msg
char ACchar = pstr.charAt(4); // indicateas alarm active
if(achar =='M' && ACchar == 'A')
{
Sqchar1= pstr.charAt(6);
if(pstr.charAt(7)!=' ')
{
sqnum=2;
Sqchar2= pstr.charAt(7);
pospri = 9;
}
else
{
sqnum=1;
Sqchar2=' ';
pospri = 8;
sq = Character.getNumericValue(Sqchar1);
}
if(sqnum==2)
{
if(pstr.charAt(8)!=' ')
{
//squnum =3
pospri = 10;
Sqchar3= pstr.charAt(8);
int sq1 = Character.getNumericValue(Sqchar1);
int sq2 = Character.getNumericValue(Sqchar2);
int sq3 = Character.getNumericValue(Sqchar3);
sq= (sq1 * 100) + (sq2 * 10) + sq3;
}
else
{
int sq1 = Character.getNumericValue(Sqchar1);
int sq2 = Character.getNumericValue(Sqchar2);
sq= (sq1 *10) + sq2;
pospri = 9;
}
}
int plen = pstr.length();
fnd=false;
for(int x=0; x<plen; x++)
{
char ichar = pstr.charAt(x);
if(ichar== '"' && !fnd)
{
indxs = x+1; fnd = true;
}
else
if(ichar == '"' && fnd)
{
indxe = x; break;
}
}
String amsg = pstr.substring(indxs, indxe);
// stop repetated msgs
if(sqlist[sq]== sq)
{
retval = true;
}
if (!retval)
{
sqlist[sq] = sq;
alarmlist[sq] = amsg;
clrlist[sq]=Character.toString(pstr.charAt(pospri));
sound(clrlist[sq]); tHandler.post(tRunnable);
}
}
else
if(achar =='M'&& ACchar == 'N')
{
int clen =pstr.length();
if(clen ==7)
{
Sqchar1= pstr.charAt(6);
sq= Character.getNumericValue(Sqchar1);
}
else
if(clen ==8)
{
Sqchar1= pstr.charAt(6);
Sqchar2= pstr.charAt(7);
int sq1 = Character.getNumericValue(Sqchar1);
int sq2 = Character.getNumericValue(Sqchar2);
sq= (sq1 * 10) + sq2;
}
else
if(clen ==9)
{
Sqchar1= pstr.charAt(6);
Sqchar2= pstr.charAt(7);
Sqchar3= pstr.charAt(8);
int sq1 = Character.getNumericValue(Sqchar1);
int sq2 = Character.getNumericValue(Sqchar2);
int sq3 = Character.getNumericValue(Sqchar3);
sq= (sq1 * 100) + (sq2 * 10) + sq3;
}
sqlist[sq] = 0;
alarmlist[sq] = null;
clrlist[sq]= null; cHandler.post(cRunnable);
}
else
{
return;
}
list.clear();
int elementsCount = alarmlist.length;
v=0;
for(int i=0; i < elementsCount; i++)
{
String disp =alarmlist[i];
if(disp != null)
{
list.add(v, disp+ "#" + clrlist[i]);
v++;
}
}
write(list, "/mnt/sdcard/msg.tmp"); dHandler.post(dRunnable);
} //alarm msg
return;
}
Ваш код не имеет смысла; и ваш код не ведет себя так, как описано. 'msg' не может быть пустым в том месте, где вы его тестируете; и в этом коде нет ничего чувствительного к длине сообщения по-разному. – EJP
Да, вы правы. После публикации вопроса я пытался его решить. Кажется, что-то не так с моим методом void. Когда условия в методах не выполняются, он не возвращается к вызывающему потоку. Поэтому я собираюсь добавить пустой оператор return и попробовать. – Jro
HI EJP, Тем не менее я не мог решить проблему. Я отправляю этот метод. Можете ли вы проверить, что в логике или что-то не так. Просто сообщите, что я новичок в Java и Android. – Jro