黑马程序员技术交流社区

标题: 关于UDP传输的问题 [打印本页]

作者: 王春蕾    时间: 2014-4-26 10:28
标题: 关于UDP传输的问题
我定义了接收端和发送端两个类,代码如下:
接收端:
  1. package net.udp;

  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.SocketException;

  6. public class UDPReceiver {

  7.         public static void main(String[] args) throws IOException {
  8.                 // TODO Auto-generated method stub
  9.                 /*
  10.                  * 建立UDP的接收端
  11.                  * 思路:
  12.                  * 1、必须有UDP的端点,socket
  13.                  * 2、接收数据,并解析数据
  14.                  * 3、将数据打印出来,并结束接收动作
  15.                  */
  16.                 System.out.println("UDP接收端开启。。。。");
  17.                 //1、创建一个UDP的端点。注意:接收端一定要明确具体的端口,否则收不到数据
  18.                 DatagramSocket ds=new DatagramSocket();
  19.                 //2、接收数据,一般使用socket服务的动作完成,将数据存储到数据包对象中
  20.                 byte[] buf=new byte[1024];
  21.                 DatagramPacket dp=new DatagramPacket(buf,buf.length);
  22.                 ds.receive(dp);
  23.                 //3、通过数据包对象的方法对数据进行解析
  24.                 String ip=dp.getAddress().getHostAddress();
  25.                 int port=dp.getPort();
  26.                 String text=new String(dp.getData(),0,dp.getLength());
  27.                 System.out.println("ip:"+ip+";port:"+port+";"+text);
  28.                 ds.close();
  29.                 System.out.println("UDP接收端关闭");
  30.         }
  31. }
复制代码

发送端:
  1. package net.udp;

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

  8. public class UDPSender {

  9.         public static void main(String[] args) throws SocketException, IOException {
  10.                 // TODO Auto-generated method stub
  11.                 /*
  12.                  * 需求:创建一个UDP发送端 思路: 1、先创建UDP端点,也就是UDP的socket 2、将数据封装成数据包
  13.                  * 3、通过UDP的端点将数据包发送出去
  14.                  */
  15.                 System.out.println("UDP发送开始》》》》");
  16.                 // 1、创建socket
  17.                 DatagramSocket ds = new DatagramSocket(9527);
  18.                 // 2、将数据封装成数据包
  19.                 String str = "UDP发送数据演示";
  20.                 byte[] buf = str.getBytes();
  21.                 // 2.1 创建数据包对象
  22.                 DatagramPacket dp = new DatagramPacket(buf, buf.length,
  23.                                 InetAddress.getByName("localhost"), 10000);
  24.                 //3、使用UDP的socket服务将数据包发送出去
  25.                 ds.send(dp);
  26.                 //4、关闭资源:
  27.                 ds.close();
  28.                 System.out.println("《《《UDP发送结束");
  29.         }
  30. }
复制代码

接收端的DatagramSocket的9527端口是什么意思啊?不是已经定义了10000端口吗?为什么写9527也可以
接收到?这两个端口有什么区别呢?
作者: 轻语。    时间: 2014-4-26 11:25
DatagramSocket是构造数据报套接字并将其绑定到本地主机上任何可用的端口。 DatagramPacket是 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口。
作者: 轻语。    时间: 2014-4-26 11:26
查阅API文档这两个方法就知道了。
我的理解就是 它们不是一个计算机上的端口。(前提是发送端和接收端不在一个计算机上)
作者: 创造命运    时间: 2014-4-26 22:32
接收端的DatagramSocket的9527端口是什么意思啊?不是已经定义了10000端口吗?为什么写9527也可以接收到?这两个端口有什么区别呢?
第一:接收端的DatagramSocket的9527端口???什么意思,没明白。         
这是你的代码,在DatagramSocket()里你都没有加上端口嘛。也就是说你没有指定用哪个端口来接收。看你还写了注意,说明你是知道这一点的。可能是失误。

第二:不是已经定义了10000端口吗?为什么写9527也可以接收到?   不会吧,我用自己的代码试了,如果发送端跟接收端所指定的端口号不一样的话,在接收端不可能接收到数据啊。我指的是这两处的端口:DatagramSocket ds = new DatagramSocket(10000);
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 10000);



第三:10000端口跟9527端口没什么区别,只不过是计算机里面的两个不同的端口,仅此而已。





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