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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁錦泰 黑马帝   /  2012-5-10 20:43  /  2091 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是獨立的兩個類,為了程序的完整性我全部貼了出來,其實問題只是針對一個語句

  1. public class UdpRecDemo2 {

  2.         /**
  3.          * @param args
  4.          * @throws IOException
  5.          */
  6.         public static void main(String[] args) throws IOException {
  7.                 // TODO Auto-generated method stub
  8.                 while (true) {
  9.                         DatagramSocket ds = new DatagramSocket(10001);//這句話爲什麽不能寫在循環內,運行時會報錯.
  10.                         byte[] buf = new byte[1024];
  11.                         DatagramPacket dp = new DatagramPacket(buf, buf.length);
  12.                         ds.receive(dp);
  13.                         String ip = dp.getAddress().getHostAddress();
  14.                         String data = new String(dp.getData(), 0, dp.getLength());
  15.                         System.out.println(ip + ":" + data);
  16.                 }
  17.         }

  18. }


  19. public class UdpSendDemo2 {

  20.         /**
  21.          * @param args
  22.          * @throws IOException
  23.          */
  24.         public static void main(String[] args) throws IOException {
  25.                 // TODO Auto-generated method stub
  26.                 DatagramSocket ds = new DatagramSocket();
  27.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
  28.                                 System.in));
  29.                 String line = null;
  30.                 while ((line = bufr.readLine()) != null) {
  31.                         if ("over".equals(line)) {
  32.                                 break;
  33.                         }
  34.                         byte[] buf = line.getBytes();
  35.                         DatagramPacket dp = new DatagramPacket(buf, buf.length,
  36.                                         InetAddress.getByName("192.168.1.114"), 10001);
  37.                         ds.send(dp);

  38.                 }
  39.                 ds.close();

  40.         }

  41. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
因为如果把 DatagramSocket ds = new DatagramSocket(10001);放在while循环内,则没运行一次,就会创建一个ds
虽然写在里面没太多的问题,但是最好是放在循环外面,能用一个变量解决的问题,何必用多个呢???

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
在循环中,你不停地执行  DatagramSocket ds = new DatagramSocket(10001);,而你又没有关闭ds,所以,当第二次循环时,时,端口已经被绑定,无法在绑定,抛出绑定异常。改进方法有两种:
1、将此语句放在循环外面,此种方法占用资源较下一种方法少。
2、在循环末尾加上ds.close();此种方法要不断建立和关闭DatagramSocket ,占用系统资源较多。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘旭 发表于 2012-5-10 21:28
在循环中,你不停地执行  DatagramSocket ds = new DatagramSocket(10001);,而你又没有关闭ds,所以,当第 ...

明瞭!!! 謝謝你.... :handshake
回复 使用道具 举报
袁錦泰 发表于 2012-5-10 21:33
明瞭!!! 謝謝你....

:handshake
回复 使用道具 举报
在一个死循环里面,多个ds对象强用一个端口10001,这样就会报错了。
回复 使用道具 举报
在一个死循环里面,多个ds对象抢用一个端口10001,这样就会报错了。
回复 使用道具 举报
DatagramSocket ds = new DatagramSocket(10001);放在循环里,会出现端口已绑定异常。因为端口被多次绑定!!!
回复 使用道具 举报
DatagramSocket ds = new DatagramSocket(10001); 这段在运行时会监听10001端口,当你循环的时候,又new了一个对象监听10001端口,因为上一个还在内存中,还没有被释放掉,所以会发生端口已绑定异常。
当然,如果非要放在循环里的话,也不是不可以,你把监听的那个端口号让它玩个自增不就行了,循环一次端口号就换一个,就没问题了
不过这种方式自己玩还行,实际开发中就不要用了,浪费资源
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马