A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 龚振 龚振 龚振 中级黑马   /  2012-4-5 00:29  /  1734 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在day23中UdpDemo2里面的小问题,如下,
太长省略了发送端的代码,byte[] buf = new byte[1024]语句放入循环外面有什么区别吗?
我自己试了下好像是没有区别的,不知是否?
还想问一下贴代码怎么带格式的呀,就是颜色也同时贴上来的?求帮助~
class  UdpRece2
{
public static void main(String[] args) throws Exception
{
  DatagramSocket ds = new DatagramSocket(10001);
  while(true)
  {
   byte[] buf = new byte[1024]; //语句放入循环外面有什么区别吗?
   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   ds.receive(dp);
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   
   System.out.println(ip+"::"+data);
  }
}
}

3 个回复

倒序浏览
语句放入循环里面:每次while循环,会new一个byte[]对象。语句放入循环外面:只new一个byte[]对象。但每次循环之后要记得清空数组中的数据,以免影响下一次循环的读写。
回复 使用道具 举报
while(true) //这里的while(true)值为true就是表示一直在等待接收数据  {
  byte[] buf = new byte[1024]; //语句放入循环外面有什么区别吗?//放在里面每次接收到的数据都会创建一个缓冲区,有利于多线程同步,放在外面就会有局限性了,当我要同时接收多条数据的时候,每条数据的内容都是不一样的,一个缓冲区能同时装不同类型的数据吗?那是不可能的,多以必须定义里面,一面以后对功能的扩展   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   ds.receive(dp);
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   
   System.out.println(ip+"::"+data);
  }
}
}

回复 使用道具 举报
while(true){
       byte[] buf = new byte[1024];
}
每次接收到数据的时候他都会新键一个buf。
DatagramPacket dp = new DatagramPack(buf,buf.length);
buf.length是接收到数据的长度。

如果buf放到外面,假如第一次接收到的数据长度大于第二接收数据长度的话buf.length就指的是第一次的数据的长度,buf中多出第二次接收到的数据长度以上的数据是第一次接收到的数据,那么获取数据的时候就出现错误。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马