我正在实现UDP客户端 - 服务器程序的服务器端。我跟踪seq_num中的预期序列号,并计算sequence_number中数据报中收到的序列号。虽然seq_num和sequence_number的值打印为128,但程序在序列号超过127后不输入if(sequence_number == seq_num)条件。任何想法为什么会发生这种情况?代码段如下所示。
收到的数据包中的前四个字节包含序列号。将其与在se循环中递增的计数器seq_num进行比较。当seq_num达到128时,不输入if条件。
while(true){
System.out.println("Waiting to receive packet");
dg.receive(packet);
buf = packet.getData();
System.out.println("Received packet");
Random rn =new Random();
double p = rn.nextDouble();
System.out.println(p);
byte[] seqnumarray = new byte[4];
for (int i=0; i<4 ; i++)
{
System.out.println(buf[i]);
seqnumarray[i] = buf[i];
}
Integer sequence_number = java.nio.ByteBuffer.wrap(seqnumarray).getInt();
System.out.println("seq num received is "+sequence_number);
if (p > prob)
{
System.out.println("seq_num is " + seq_num);
System.out.println("sequence_number is " + sequence_number);
if(seq_num == sequence_number){
谢谢!
答案 0 :(得分:2)
您正在使用Integer
包装器类而不是int
原语(实际上是ByteBuffer.getInt()
返回的原语),并且适用于引用和值相等的标准Java规则。作为优化,运行时将Integer
值-128实际调整为127,因此使用==
偶然使用这些值,但对于一般情况,您需要使用equals
。更好的是,只需使用普通int
。