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

© 高鑫 中级黑马   /  2012-7-14 18:41  /  1921 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高鑫 于 2012-7-15 02:35 编辑
  1. import java.net.*;

  2. class UDPsend
  3. {
  4.         public static void main(String args[])throws Exception
  5.         {
  6.             DatagramSocket ds=new DatagramSocket( );
  7.             byte[] byt= "wo de  shijie".getBytes() ;
  8.             DatagramPacket dp=
  9.                     new DatagramPacket(byt,byt.length,InetAddress.getByName("192.168.1.3"),10000);
  10.             ds.send(dp);
  11.             ds.close();
  12.         }
  13. }
  14. class UDPrece
  15. {
  16.         public static void main(String[]args)throws Exception
  17.         {
  18.                 DatagramSocket ds=new DatagramSocket(10000);
  19.                 byte[] buf=new byte[1024];
  20.                 DatagramPacket dp=new DatagramPacket(buf,buf.length);
  21.                 ds.receive(dp);
  22.                 String address=dp.getAddress().getHostAddress();
  23.                  
  24.                 int port=dp.getPort();
  25.                 String text=new String(buf,0,dp.getLength());
  26.                 System.out.println(address+","+port+","+text);
  27.                
  28.                 ds.close();
  29.         }        
  30. }


复制代码
我的问题:发送端顺序,1-数据从数组中封装到Datagrampacket中 2-通过发送端的Datagramsocket发送
              接收端顺序:1,Datagramsocket接受到数据,2,数据通过Datagrampacket接收,
请问我理解的顺序对吗??接受端的定义的数组跟Datagrampacket(buf,buf.length)初始化,长度buf.length是把数组都填满,多余的数据用null表示,还是别的什么??,他们之间内部是怎么运作的??求详细解释

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

2 个回复

倒序浏览
你说的基本正确
不过老师在视频中已经详细讲过发送接收过程了
我在此借毕老师的话给你讲下:

import java.net.*;

class UDPsend                                                                                 //放送端:
{
        public static void main(String args[])throws Exception
        {
            DatagramSocket ds=new DatagramSocket( );            //(1)建立udpSocket服务
            byte[] byt= "wo de  shijie".getBytes() ;
            DatagramPacket dp=                                                      //(2)提供数据,将数据封装到数据包中
                    new DatagramPacket(byt,byt.length,InetAddress.getByName("192.168.1.3"),10000);
            ds.send(dp);                                                                      //(3)通过Socket服务的发送功能将数据包发出去
            ds.close();                                                                     //(4)关闭资源
        }
}
class UDPrece                                                                                              //接收端
{
        public static void main(String[]args)throws Exception
        {
                DatagramSocket ds=new DatagramSocket(10000);                     //(1)定义udpSocket服务(通常会监听一个端口)
                byte[] buf=new byte[1024];
                DatagramPacket dp=new DatagramPacket(buf,buf.length); //(2)定义一个数据包,因为要存储接收到的字节数据。
                ds.receive(dp);                                                                           //(3) 通过Socket服务的接收功能将数据存入已定义好的数据包中
                String address=dp.getAddress().getHostAddress();                  //(4)通过数据包对象提供的特有功能,经这不同的数据取出

                int port=dp.getPort();
                String text=new String(buf,0,dp.getLength());
                System.out.println(address+","+port+","+text);

                ds.close();                                                                                //(5)关闭资源
        }        
}
至于 DatagramPacket dp=new DatagramPacket(byte[] buf, int length);中的length是你要接受数据的长度,你也可以自定义,例如为8则只接收8个字节,
定义为buf.length 其余的应该为byte的默认值为0;


评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
韦念欣 + 1 赞一个!
高鑫 + 30

查看全部评分

回复 使用道具 举报
本帖最后由 张莹莹 于 2012-7-15 03:02 编辑

1、对buf填充的内容测试如下,首先让recevie接收两次,查看buf中的内容,代码如下:

让send先发送"1234567890",再发送"abcde",运行结果如下

可以看出,buf中是从0处开始填写的,接收了多少就填充多少,剩余的原来是什么现在保持不变,所以在new String的时候,需要填写接收到的数据长度。
2、至于第二个问题,我查看了一下JAVA的源代码,其中receive是调用了PlainDatagramSocketImpl类中的receive,但是PlainDatagramSocketImpl这个类不是公开的,并且其源代码中的receive方法并未直接用java实现,而是通过JNI方式调用了“Java_java_net_PlainDatagramSocketImpl_receive0”,这个应该是非JAVA语言写的方法,并且无从知晓其源代码,所以无法具体弄清楚工作原理。

但是可以通过计算机网络的知识大体了解发送过程。
首先发送方将要发送的数据封装到UDP报文,UDP报文加上其UDP头部之后封装到IP数据包中,IP数据包再被封装到MAC帧中,并发送到接收方,接收方在相反地拆封数据包,层层向上交,最后给JAVA。JAVA已经将一系列的网络方法封装好了,如果想更加详细的了解工作过程,建议仔细的学习一下计算机网络,会有所帮助~

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 原理图文说明,赞一个!

查看全部评分

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