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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cyh8807 中级黑马   /  2013-2-27 12:01  /  2328 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;
  2. import java.net.*;
  3. public class UdpReceiveDemo
  4. {
  5.     public static void main(String[] args) throws Exception
  6.     {
  7.         DatagramSocket ds = new DatagramSocket(10001);
  8.         
  9.         while(true)
  10.         {
  11.             byte[] buf = new byte[1024];
  12.             DatagramPacket dp = new DatagramPacket(buf,buf.length);
  13.             
  14.             ds.receive(dp);
  15.             
  16.             byte[] data = dp.getData();
  17.             String str = new String(data,0,dp.getLength());
  18.             String ip = dp.getAddress().getHostAddress();
  19.             System.out.println(str + ip);
  20.         }
  21.       ds.close();
  22.         
  23.     }
  24. }
复制代码
上述代码,如果注释掉最后一行ds.close()就可以成功运行
但是如果不注释掉的话就会出错,程序无法运行
请大家给解释下,谢谢

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

5 个回复

正序浏览
因为while(true) 是一直成立的    将一直循环下去    不会执行到  close这行代码  无用的当然会报错    需要有个判断 能够退出循环  就可以执行close方法了  

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
这是接收端的一个并发机制,定义在死循环内部是为了不断的接收发送端发过来的数据包
你可以理解为接收端就向一个服务器一样,我们与服务器连接是不是必须保证服务器开着呢?一样的道理
它一直开着,都不会在循环里跳出,跳不出来根本就执行不到close()这句嘛,jvm虚拟机能让你这么干么? 对吧 哈哈  :lol

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
因为你上面设置的是死循环, java虚拟机会认为你下面那条ds.close是无用代码..所以会报错./
回复 使用道具 举报
王钊 发表于 2013-2-27 12:16
while(ture)是一个死循环,他在不断地用DatagramSocket接收数据,它没有退出一个循环的条件,
你应该设置一 ...

谢谢你的回答,我明白了
回复 使用道具 举报
本帖最后由 王钊 于 2013-2-27 12:17 编辑

while(ture)是一个死循环,他在不断地用DatagramSocket接收数据,它没有退出一个循环的条件,
你应该设置一个,比如说:收到了什么消息字符串就可以退出循环了,或者设置一个变量i,连续就收多少次即可退出。
这样就可以顺利ds.close()了。
你这样写ds.close()为不可达代码。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马