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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© doyxy 中级黑马   /  2014-4-4 18:46  /  1001 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 doyxy 于 2014-4-5 08:27 编辑

在UDP聊天的课程里,毕老师把DatagramSocket定义在了外面,并且用构造函数传入,而我直接在里面设置运行起来也是一样可以,请问为什么要设置在外面呢?谢谢
  1. package NetTest;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.DatagramPacket;
  6. import java.net.DatagramSocket;
  7. import java.net.InetAddress;
  8. import java.net.SocketException;

  9. //创建一个UDP发送和接收程序.
  10. // step2 将两个控制台合并,在一个控制台上显示收发内容.用多线程实现.
  11. public class UDPDemo {

  12.         /**
  13.          * @param args
  14.          */
  15.         public static void main(String[] args) {
  16.                 // TODO Auto-generated method stub
  17.                 new Thread(new UDPSend()).start();
  18.                 new Thread(new UDPRece()).start();
  19.         }

  20. }
  21. /* 毕老师的写法:

  22. //发送端
  23. class UDPSend implements Runnable{
  24.         private DatagramSocket ds;
  25.         
  26.         public UDPSend(DatagramSocket ds){
  27.                 this.ds = ds;
  28.         }
  29.         
  30.         @Override
  31.         public void run() {
  32.                 // TODO Auto-generated method stub
  33.                 try {
  34.                         DatagramPacket dp;
  35.                         while (true){
  36.                                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  37.                                 String line = null;
  38.                                 while ((line=bufr.readLine())!=null){
  39.                                         if ("over".equals(line))
  40.                                                 return;
  41.                                         dp = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.1.101"),5555);
  42.                                         ds.send(dp);
  43.                                 }
  44.                         }
  45.                 } catch (IOException e) {
  46.                         // TODO Auto-generated catch block
  47.                         e.printStackTrace();
  48.                 }
  49.         }
  50.         
  51. }

  52. class UDPRece implements Runnable {
  53.         private DatagramSocket ds = null;
  54.         
  55.         public UDPRece(DatagramSocket ds){
  56.                 this.ds = ds;
  57.         }
  58.         public void run() {
  59.                 while (true) {// 一直准备接收数据
  60.                         try {
  61.                                 byte[] buf = new byte[1024];
  62.                                 DatagramPacket dp = new DatagramPacket(buf, buf.length);// 接收数据后的存储位置
  63.                                 ds.receive(dp);// 接收数据
  64.                                 String ip = dp.getAddress().getHostAddress();// 获取数据中的ip
  65.                                 String data = new String(buf, 0, dp.getLength());// 获取数据内容
  66.                                 System.out.println("ip:(" + ip + "):" + data);
  67.                                 // ds.close();
  68.                         } catch (IOException e) {
  69.                                 // TODO Auto-generated catch block
  70.                                 e.printStackTrace();
  71.                         }
  72.                 }
  73.         }
  74. }
  75. */

  76. // 我的写法:

  77. // 发送端,1,建立UDPsocket,2,封装数据,3,发送,4,关闭
  78. class UDPSend implements Runnable {
  79.         public void run() {
  80.                 DatagramSocket ds = null;
  81.                 try {
  82.                         ds = new DatagramSocket();
  83.                 } catch (SocketException e1) {
  84.                         // TODO Auto-generated catch block
  85.                         e1.printStackTrace();
  86.                 }
  87.                 while (true) {// 一直准备发送数据,通过控制台输入
  88.                         try {
  89.                                 // 录入数据
  90.                                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
  91.                                                 System.in));
  92.                                 String line = null;
  93.                                 while ((line = bufr.readLine()) != null) {
  94.                                         if ("over".equals(line))
  95.                                                 return;
  96.                                         byte[] buf = line.getBytes();
  97.                                         DatagramPacket dp = new DatagramPacket(buf, buf.length,
  98.                                                         InetAddress.getByName("192.168.1.101"), 5561);// 将数据写入包中,
  99.                                         //ip192.168.1.255为广播,发送往该网段所有的主机

  100.                                         ds.send(dp);
  101.                                 }
  102.                                 // ds.close();
  103.                         } catch (IOException e) {
  104.                                 // TODO Auto-generated catch block
  105.                                 e.printStackTrace();
  106.                         }
  107.                 }
  108.         }
  109. }

  110. class UDPRece implements Runnable {
  111.         public void run() {
  112.                 DatagramSocket ds = null;
  113.                 try {
  114.                         ds = new DatagramSocket(5561);// 需要在while(true)外面设置,否则发生端口绑定异常
  115.                 } catch (SocketException e1) {
  116.                         // TODO Auto-generated catch block
  117.                         e1.printStackTrace();
  118.                 }
  119.                 while (true) {// 一直准备接收数据
  120.                         try {
  121.                                 byte[] buf = new byte[1024];
  122.                                 DatagramPacket dp = new DatagramPacket(buf, buf.length);// 接收数据后的存储位置
  123.                                 ds.receive(dp);// 接收数据
  124.                                 String ip = dp.getAddress().getHostAddress();// 获取数据中的ip
  125.                                 String data = new String(buf, 0, dp.getLength());// 获取数据内容
  126.                                 int port = dp.getPort();
  127.                                 System.out.println("ip:(" + ip + "),data:(" + data + "),port:("
  128.                                                 + port + ").");
  129.                                 // ds.close();
  130.                         } catch (IOException e) {
  131.                                 // TODO Auto-generated catch block
  132.                                 e.printStackTrace();
  133.                         }
  134.                 }
  135.         }
  136. }
复制代码



1 个回复

倒序浏览
写在外边是为了再有局部函数使用该变量时使用。而构造函数你好像复制错了,构造函数重载后,默认无参的构造函数就没有了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马