黑马程序员技术交流社区

标题: 網絡編程細節問題 [打印本页]

作者: 袁錦泰    时间: 2012-5-10 20:43
标题: 網絡編程細節問題
下面是獨立的兩個類,為了程序的完整性我全部貼了出來,其實問題只是針對一個語句

  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. }
复制代码

作者: 小鹿叙鹿    时间: 2012-5-10 21:26
因为如果把 DatagramSocket ds = new DatagramSocket(10001);放在while循环内,则没运行一次,就会创建一个ds
虽然写在里面没太多的问题,但是最好是放在循环外面,能用一个变量解决的问题,何必用多个呢???
作者: 刘旭    时间: 2012-5-10 21:28
在循环中,你不停地执行  DatagramSocket ds = new DatagramSocket(10001);,而你又没有关闭ds,所以,当第二次循环时,时,端口已经被绑定,无法在绑定,抛出绑定异常。改进方法有两种:
1、将此语句放在循环外面,此种方法占用资源较下一种方法少。
2、在循环末尾加上ds.close();此种方法要不断建立和关闭DatagramSocket ,占用系统资源较多。
作者: 袁錦泰    时间: 2012-5-10 21:33
刘旭 发表于 2012-5-10 21:28
在循环中,你不停地执行  DatagramSocket ds = new DatagramSocket(10001);,而你又没有关闭ds,所以,当第 ...

明瞭!!! 謝謝你.... :handshake
作者: 刘旭    时间: 2012-5-10 21:53
袁錦泰 发表于 2012-5-10 21:33
明瞭!!! 謝謝你....

:handshake
作者: 黄坚声    时间: 2012-5-10 23:09
在一个死循环里面,多个ds对象强用一个端口10001,这样就会报错了。
作者: 黄坚声    时间: 2012-5-10 23:09
在一个死循环里面,多个ds对象抢用一个端口10001,这样就会报错了。
作者: 余耀明    时间: 2012-5-10 23:17
DatagramSocket ds = new DatagramSocket(10001);放在循环里,会出现端口已绑定异常。因为端口被多次绑定!!!
作者: 索学超    时间: 2012-5-11 09:10
DatagramSocket ds = new DatagramSocket(10001); 这段在运行时会监听10001端口,当你循环的时候,又new了一个对象监听10001端口,因为上一个还在内存中,还没有被释放掉,所以会发生端口已绑定异常。
当然,如果非要放在循环里的话,也不是不可以,你把监听的那个端口号让它玩个自增不就行了,循环一次端口号就换一个,就没问题了
不过这种方式自己玩还行,实际开发中就不要用了,浪费资源




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2