快绝望了:UDP接受存入LinkedList突然出现奇怪的问题
问题:
如果我第一次接受的01,则 LinkedList datalist中就有01。
但是如果我第二次接受到02,则datalist中两个全是02。(第一项应该是01,在接第二项时被修改了)
我仔细跟了一天,愣没发现问题出现在那里。
我这个代码以前用过N天,都没出现问题呀
(现在是Winxp sp2+Eclipse3.1+JDK1.5)
源码如下
package main;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.LinkedList;
//import smspack.Msg;
public class ReceiverThread extends Thread {
private DatagramSocket socket;
private boolean stopped=false;
private InetAddress server;
private int port;
private static int nzf1=0;
private static LinkedList dataList=new LinkedList();
public ReceiverThread(DatagramSocket ds,LinkedList data_list)throws SocketException {
this.socket =ds;
// this.dataList=data_list;
}
public ReceiverThread(InetAddress ia,int port)throws SocketException{
this.server=ia;
this.port =port;
this.socket =new DatagramSocket(port,ia);
}
public ReceiverThread(int UDPListernPort)throws SocketException {
this.socket =new DatagramSocket(UDPListernPort);
}
public void halt(){
this.stopped=true;
}
private String bytesToHexString(byte[] b) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
String s=(String)Integer.toHexString(b[i] >= 0 ? b[i] : b[i] + 256);
if (s.length()==1) {
s="0"+s;
}
sb.append(s);
sb.append(".");
}
return sb.toString();
}
public void run(){
// 接受外部单个IP UDP数据的缓冲区
byte[] buffer_rec=new byte[256];
while(!stopped){
DatagramPacket dp=new DatagramPacket(buffer_rec,buffer_rec.length);
try{
socket.receive(dp);
this.dataList.addLast(dp.getData());
System.out.println("接到UDP:"
+this.bytesToHexString(dp.getData()));
// this.nzf1=this.nzf1+1;
// this.dataList.add(new byte[]{(byte) this.nzf1});//add it use byte type.
if (this.dataList.size()>1){
//测试用
for (int i=0;i<this.dataList.size();i++){
//byte[] tmp=(byte[])this.dataList.get(i);
byte[] tmp=((byte[])this.dataList.get(i));
System.out.println("DataList("+Integer.toString(i)+"):"
+this.bytesToHexString(tmp));
}
}
Thread.yield();
} catch(IOException e){
System.err.println("收集UDP包到缓冲区 出错:"+e);
e.printStackTrace();
}
}
}
}