使用UDP连接对象原理

  介绍

本篇文章给大家分享的是有关使用UDP连接对象原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

由于UDP是无状态的,在创建DatagramSocket对象时只是创建了一个指向网络的对象,就像你架设一个大喇叭对着某个方向,可是你并不知道这个方向到底有没有人在听。

如果,即使你没有开服务端,创建连接对象并向这个地址放松数据,都是没有问题。你用喇叭向某个方向喊没人听这没有什么!可是当你需要回应时如果一直没有接到响应,超时之后就会报错!

 udp包;
  
  进口java.net。*;/* *
  * @说明UDP客户端程序,用于对服务端发送数据,并接收服务端的回应信息
  * @author cuisuqiang
  * @version 1.0
  * @since & lt; a href=癿ailto: cuisuqiang@163.com"rel=巴獠縩ofollow"在cuisuqiang@163.com
  */公开课UdpClientSocket {/* *
  *连接对象
  */私有静态DatagramSocket ds=零;/* *
  *地址对象
  */私有静态SocketAddress地址都=零;/* *
  *测试客户端发包和接收回应信息的方法
  */公共静态void main (String [] args){抛出异常
  init ();
  而(真){
  UdpClientSocket.send(地址,“你好,亲爱的!“.getBytes ());
  UdpClientSocket.receive ();
  尝试{
  线程。睡眠(3 * 1000);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }
  }/* *
  *对连接和地址初始化
  */公共静态孔隙init () {
  尝试{
  ds=new DatagramSocket (8899);//邦定本地端口作为客户端
  ds。setSoTimeout (2 * 1000);
  地址=new InetSocketAddress (“127.0.0.1", 3344);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }/* *
  *向指定的服务端发送数据信息
  */公共静态无效发送(SocketAddress地址,都byte[]字节){
  尝试{
  DatagramPacket dp=new DatagramPacket(字节,字节。长度、地址);
  ds.send (dp);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }/* *
  *接收从指定的服务端发回的数据
  */公共静态空间接收(){
  尝试{
  byte[]新字节缓冲区=[1024];
  DatagramPacket dp=new DatagramPacket(缓冲区,buffer.length);
  ds.receive (dp);
  byte[]数据=new byte [dp.getLength ());
  System.arraycopy (dp.getData() 0数据,0,dp.getLength ());
  System.out.println(“服务端回应数据:“+新的字符串(数据));
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }
  }

执行以代码运行结果如下:

java.net.SocketTimeoutException:接收超时
在java.net.PlainDatagramSocketImpl.receive0(本机方法)
java.net.PlainDatagramSocketImpl.receive (PlainDatagramSocketImpl.java: 136)
java.net.DatagramSocket.receive (DatagramSocket.java: 712)
udp.UdpClientSocket.receive (UdpClientSocket.java: 69)
udp.UdpClientSocket.main (UdpClientSocket.java: 28)

运行超时,但是报错的地方不是创建对象和发送数据,而是接收数据时超时!

这个程序一直运行,我们来搞一个服务端:

 udp包;
  
  进口java.net.DatagramPacket;
  进口java.net.DatagramSocket;
  进口java.net.InetSocketAddress;
  进口java.net.SocketAddress;/* *
  * @说明UDP服务类
  * @author cuisuqiang
  * @version 1.0
  * @since cuisuqiang@163.com
  */公开课UdpServerSocket {
  
  私有静态DatagramSocket ds=零;
  私有静态SocketAddress地址都=零;/* *
  *测试方法
  */公共静态void main (String [] args){抛出异常
  init ();
  System.out.println(“- - - - -在服务开始监听! & lt;——“);
  而(真){
  UdpServerSocket.receive ();
  UdpServerSocket.response(地址,“你好,吃了吗!“);
  }
  }
  
  公共静态孔隙init () {
  尝试{
  ds=new DatagramSocket (3344);
  ds.setSoTimeout (0);
  地址=new InetSocketAddress (“127.0.0.1", 8899);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }/* *
  *接收数据包,该方法会造成线程阻塞
  */公共静态空间接收(){
  尝试{
  byte[]新字节缓冲区=[1024];
  DatagramPacket包=new DatagramPacket(缓冲区,buffer.length);
  ds.receive(包);
  字符串信息=新的字符串(packet.getData (), 0, packet.getLength ());
  System.out.println(“接收信息:“+信息);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }/* *
  *将响应包发送给请求端
  */公共静态无效响应(SocketAddress地址,都字符串信息){
  尝试{
  DatagramPacket dp=new DatagramPacket (info.getBytes (), info.getBytes ()。长度、地址);
  dp.setData (info.getBytes ());
  ds.send (dp);
  }捕捉(异常e) {
  e.printStackTrace ();
  }
  }
  }

使用UDP连接对象原理