网络编程-UDP【转】_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 网络编程-UDP【转】

网络编程-UDP【转】

 2013/10/19 3:47:25  edr_  程序员俱乐部  我要评论(0)
  • 摘要:UDP通信转自传智播客:1、DatagramPacket在码头发送和接收货物时都需要使用集装箱来装载货物,同样,使用UDP通信时,发送和接收的数据也需要通过集装箱进行传输,这里的集装箱就是一个数据包。在JDK中提供DatagramPacket的类,该类的功能就是封装数据包,用于存放发送或者接收的信息。DatagramPacket(byte[]buf,intlength):该构造方法在创建DatagramPacket对象时,只指定了数据包的内存空间(buf)和大小(length)
  • 标签:网络 编程
UDP通信
转自传智播客:
1、 DatagramPacket
在码头发送和接收货物时都需要使用集装箱来装载货物,同样,使用UDP通信时,发送和接收的数据也需要通过集装箱进行传输,这里的集装箱就是一个数据包。在JDK中提供DatagramPacket的类,该类的功能就是封装数据包,用于存放发送或者接收的信息。

DatagramPacket(byte[] buf,int length):
该构造方法在创建DatagramPacket对象时,只指定了数据包的内存空间(buf)和大小(length),相当于只定义了集装箱的大小。因此,在接收数据时,我们是没法事先就知道哪个地址和端口的Socket会发来数据,就像我们要准备一个集装箱去接收发给我们的货物时,是不用标明发货人或收获人的地址的,所以我们使用该构造方法来创建接收端的DatagramPacket对象。

2、 DatagramSocket
在发送和接收货物都需要使用集装箱,但是只有集装箱还不够,还得有发送和接收集装箱的码头,在JDK中提供了一个类似码头功能的DatagramSocket类,用在接收端和发送端。DatagramSocket类常用的构造方法如下:
DatagramSocket():
该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。

DatagramSocket(intport):
该构造方法既可用于创建接收端的DatagramSocket对象,还可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。

3、 UDP网络程序DatagramSocket
通过前面的讲解,我们知道实现UDP通信需要一个发送端程序发送数据和一个接收端程序接收数据。接下来通过两个例程来实现接收端和发送端程序,演示一下UDP通信的过程,由于在UDP通信时,接收端需要先运行,否则数据容易丢失,因此,先带大家来实现接收端程序,代码如下所示:
class="java">package test.net;

import java.net.*;
//接收端程序
public class UDP_Server {
  public static void main(String[] args) throws Exception {
      DatagramPacket dp = null;
      DatagramSocket ds = null;
      byte[] buf = new byte[1024]; // 接收数据的数组
      ds =new DatagramSocket(8954);
      dp =new DatagramPacket(buf, 1024);
      System.out.println("等待接收数据");
      ds.receive(dp);// 等待接收数据,如果没有数据则会阻塞
      String str = new String(dp.getData(), 0, dp.getLength()) + "from "
              +dp.getAddress().getHostAddress() + ":" + dp.getPort();
      System.out.println(str);
      ds.close();//释放资源
  }
}
package test.net;

import java.net.*;
//发送端程序
public class UDP_Client {
  public static void main(String[] args) throws Exception {
      DatagramPacket dp = null;
      DatagramSocket ds = null;
      ds =new DatagramSocket(3000);
      String str = "hello world";//要发送的数据
      /*
       *创建一个要发送的数据包
       *数据包包括发送的数据,数据的长度,接收端的IP地址已经端口号
       */
      dp = new DatagramPacket(str.getBytes(), str.length(),
              InetAddress.getByName("localhost"),8954);
      System.out.println("发送信息");
      ds.send(dp);
      ds.close();
  }
}


上面的代码代表的是一个接收端程序,用来接收数据。在创建DatagramSocket对象时,指定其监听的端口号为8954,创建DatagramPacket对象时传入一个1024大小的字节数组用来接收数据,当调用DatagramSocket的receive(DatagramPacket p)方法接收到数据以后,通过DatagramPacket的getData()方法获取接收到字节数组类型的数据,通过getLength()方法获取接收到数据的长度,然后用String类的构造方法把得到的数据转换成字符串的形式打印出来。

一个发送端程序,DatagramSocket的send()方法用来发送数据。在创建DatagramPacket对象时需要指定目标IP地址和端口号,而且端口号必须要和接收端指定的端口号一致,否则接收端接收不到数据。
在接收端程序阻塞的状态下,运行发送端程序,接收端程序就会收到发送端发送的数据而结束阻塞状态,打印接收的数据。

Have a Nice day!!


上一篇: java基础英语单词总结 下一篇: 没有下一篇了!
发表评论
用户名: 匿名