问题:
如果我第一次接受的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();
}
}
}
}
如果我第一次接受的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();
}
}
}
}
我怎么也不想不通为什么接受到数据包,会改变了另一个变量的值呀
楼主继续查查看吧
>>> socket.receive(dp);执行完它,就修改了值了。
while(!stopped){
try{
byte[] buffer_rec=new byte[256];// 这行和下面这行代码搬个地方试试
DatagramPacket dp=new DatagramPacket(buffer_rec,buffer_rec.length);
...
2)看看是不是buffer_rec是同一个引用,建议在while内部new.
1:我换了ArrayList也不行。
2:在循环中生成对象,与循环外生成,我都试了
3:接收的内容,我简化成01 02这样的数字,也试了结果:涛声依旧
while (true){
>>byte[] buffer_rec=new byte[356];
>>DatagramPacket dp=new DatagramPacket(buffer_rec,356);
Sndsocket.receive(dp);原来那是引用了。所以出错,全被修改了
只是dp对象的引用?请前辈给我讲一下基础知识