问题:
如果我第一次接受的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();
      }
    }
  }
}  
  

解决方案 »

  1.   

    兄弟,我Debug一天了
    我怎么也不想不通为什么接受到数据包,会改变了另一个变量的值呀
      

  2.   

    通常这种问题是因为引用了同一个reference,但是好像你这个没这个问题,
    楼主继续查查看吧
      

  3.   

    重新安装了JVM,Eclipse也不行。接收第二个数据,就把List中的已经存在的第一个数据修改了
      

  4.   

    try{
    >>>    socket.receive(dp);执行完它,就修改了值了。
      

  5.   

    而且,以前一点问题都没有,原样运行一下,结果出这错了。(在这阶段,我就Try了MINA,Cindy框架的NIO),其他什么也没做
      

  6.   


    while(!stopped){
        try{
            byte[] buffer_rec=new byte[256];// 这行和下面这行代码搬个地方试试
            DatagramPacket dp=new DatagramPacket(buffer_rec,buffer_rec.length);
            ...
      

  7.   

    1)要想确定是不是LinkedList的问题,那就换个List;
    2)看看是不是buffer_rec是同一个引用,建议在while内部new.
      

  8.   

    呵。楼上:
    1:我换了ArrayList也不行。
    2:在循环中生成对象,与循环外生成,我都试了
    3:接收的内容,我简化成01 02这样的数字,也试了结果:涛声依旧
      

  9.   

    解决了。
    while (true){
            >>byte[] buffer_rec=new byte[356];
            >>DatagramPacket dp=new DatagramPacket(buffer_rec,356);
            Sndsocket.receive(dp);原来那是引用了。所以出错,全被修改了
      

  10.   

    为什么会这样呢?难道LinkedList中不能这样存入值。
    只是dp对象的引用?请前辈给我讲一下基础知识