快绝望了:UDP接受存入LinkedList突然出现奇怪的问题

nzfboy 2005-11-03 08:46:26
问题:
如果我第一次接受的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();
}
}
}
}



...全文
133 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzfboy 2005-11-04
  • 打赏
  • 举报
回复
为什么会这样呢?难道LinkedList中不能这样存入值。
只是dp对象的引用?请前辈给我讲一下基础知识
nzfboy 2005-11-04
  • 打赏
  • 举报
回复
解决了。
while (true){
>>byte[] buffer_rec=new byte[356];
>>DatagramPacket dp=new DatagramPacket(buffer_rec,356);
Sndsocket.receive(dp);

原来那是引用了。所以出错,全被修改了
nzfboy 2005-11-04
  • 打赏
  • 举报
回复
呵。楼上:
1:我换了ArrayList也不行。
2:在循环中生成对象,与循环外生成,我都试了
3:接收的内容,我简化成01 02这样的数字,也试了

结果:涛声依旧
liu_you 2005-11-03
  • 打赏
  • 举报
回复
1)要想确定是不是LinkedList的问题,那就换个List;
2)看看是不是buffer_rec是同一个引用,建议在while内部new.
yaray 2005-11-03
  • 打赏
  • 举报
回复

while(!stopped){
try{
byte[] buffer_rec=new byte[256];// 这行和下面这行代码搬个地方试试
DatagramPacket dp=new DatagramPacket(buffer_rec,buffer_rec.length);
...
nzfboy 2005-11-03
  • 打赏
  • 举报
回复
而且,以前一点问题都没有,原样运行一下,结果出这错了。(在这阶段,我就Try了MINA,Cindy框架的NIO),其他什么也没做
nzfboy 2005-11-03
  • 打赏
  • 举报
回复
try{
>>> socket.receive(dp);执行完它,就修改了值了。
nzfboy 2005-11-03
  • 打赏
  • 举报
回复
重新安装了JVM,Eclipse也不行。接收第二个数据,就把List中的已经存在的第一个数据修改了
believefym 2005-11-03
  • 打赏
  • 举报
回复
通常这种问题是因为引用了同一个reference,但是好像你这个没这个问题,
楼主继续查查看吧
nzfboy 2005-11-03
  • 打赏
  • 举报
回复
兄弟,我Debug一天了
我怎么也不想不通为什么接受到数据包,会改变了另一个变量的值呀
believefym 2005-11-03
  • 打赏
  • 举报
回复
debug一下看看

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧