本文详细介绍了UDP连接对象的基本原理分析和应用案例。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值,朋友们一定要参考。
之前写了一个UDP服务器和手机客户端的简单例子,供新手入门UDP。当我们具体应用的时候,发生了一点小问题!
在应用之前,因为我把join对象DatagramSocket写成了静态数据,所以在重置类的时候就应用了,但是系统软件里面有很多区域性的应用。我要不要不断的创造这种物体?
如果你能做到这一点,那时候就会有一个反作用,反作用就是内存溢出。
没有UDP的理由。DatagramSocket可以创建一次,就是开头刚好指向一个详细地址的端口号,不用每次都创建。
因为UDP是无状态的,所以当你创建DatagramSocket对象的时候,你只是创建了一个指向互联网的对象,就像你建了一个指向某个方向的扬声器,但是你不知道这个方向有没有树,有没有人在监听。
如果,即使没有服务器,创建一个连接对象,将压力数据信息发布到这个详细地址,也没有问题。你用立体声喇叭朝某个方向喊,没人听。没什么!但是如果在必须回复的时候没有收到响应,那么在请求超时之后就会得到一个错误!
packageudp; importjava.net.*; /** *@表明UDP客户端软件,用以对服务端传送数据,并接受服务端的答复信息内容 *@authorcuisuqiang *@version1.0 *@since<ahref="mailto:cuisuqiang@163.com"rel="externalnofollow">cuisuqiang@163.com</a> */ publicclassUdpClientSocket{ /** *联接对象 */ privatestaticDatagramSocketds=null; /** *详细地址对象 */ privatestaticSocketAddressaddress=null; /** *检测手机客户端分包和接受答复信息内容的方式 */ publicstaticvoidmain(String[]args)throwsException{ init(); while(true){ UdpClientSocket.send(address,"您好,親愛的的!".getBytes()); UdpClientSocket.receive(); try{ Thread.sleep(3*1000); }catch(Exceptione){ e.printStackTrace(); } } } /** *对联接和详细地址复位 */ publicstaticvoidinit(){ try{ ds=newDatagramSocket(8899);//綁定本地端口做为手机客户端 ds.setSoTimeout(2*1000); address=newInetSocketAddress("127.0.0.1",3344); }catch(Exceptione){ e.printStackTrace(); } } /** *向特定的服务端传送数据信息内容 */ publicstaticvoidsend(SocketAddressaddress,byte[]bytes){ try{ DatagramPacketdp=newDatagramPacket(bytes,bytes.length,address); ds.send(dp); }catch(Exceptione){ e.printStackTrace(); } } /** *接受从特定的服务端送回的数据信息 */ publicstaticvoidreceive(){ try{ byte[]buffer=newbyte[1024]; DatagramPacketdp=newDatagramPacket(buffer,buffer.length); ds.receive(dp); byte[]data=newbyte[dp.getLength()]; System.arraycopy(dp.getData(),0,data,0,dp.getLength()); System.out.println("服务端答复数据信息:"newString(data)); }catch(Exceptione){ e.printStackTrace(); } } }以下结果由实施程序实施:
Java.net.sockettimeoutexception:在Java.net.plaindatagramsocketimpl.Receive0(NativeMethod)
atJava.net.plaindatagramsocketimpl.Receive(plaindatagramsocketimpl.Java:136)
atJava.net.datagramsocket.Receive(datagramsocket.Java:712)
atUDP.UDPclientsocket.receive(UDPclientsocket.Java:69)
atUDP。udpclientsocket.main(udpclientsocket.Java:28)
请求超时,但错误区域不是创建对象和传输数据,而是读取数据时请求超时!
这个程序流程已经工作了,我们来设置一个服务器:
packageudp; importjava.net.DatagramPacket; importjava.net.DatagramSocket; importjava.net.InetSocketAddress; importjava.net.SocketAddress; /** *@表明UDP服务项目类 *@authorcuisuqiang *@version1.0 *@sincecuisuqiang@163.com */ publicclassUdpServerSocket{ privatestaticDatagramSocketds=null; privatestaticSocketAddressaddress=null; /** *测试标准 */ publicstaticvoidmain(String[]args)throwsException{ init(); System.out.println("---->服务项目刚开始监视!<----"); while(true){ UdpServerSocket.receive(); UdpServerSocket.response(address,"您好,吃了吗!"); } } publicstaticvoidinit(){ try{ ds=newDatagramSocket(3344); ds.setSoTimeout(0); address=newInetSocketAddress("127.0.0.1",8899); }catch(Exceptione){ e.printStackTrace(); } } /** *接受数据文件,该方式会导致进程堵塞 */ publicstaticvoidreceive(){ try{ byte[]buffer=newbyte[1024]; DatagramPacketpacket=newDatagramPacket(buffer,buffer.length); ds.receive(packet); Stringinfo=newString(packet.getData(),0,packet.getLength()); System.out.println("接受信息内容:"info); }catch(Exceptione){ e.printStackTrace(); } } /** *将回应包发给要求端 */ publicstaticvoidresponse(SocketAddressaddress,Stringinfo){ try{ DatagramPacketdp=newDatagramPacket(info.getBytes(),info.getBytes().length,address); dp.setData(info.getBytes()); ds.send(dp); }catch(Exceptione){ e.printStackTrace(); } } }运行后,手机客户端可以正常推送和读取数据!
如果在一个特定的应用程序中,我设置了一个系统启动项来重置init连接对象和详细地址,在实际应用中捕捉异常是可以的!
如果你的连接对象是每次都创建,并且频繁应用的话,一般需要十几分钟系统软件才会挂机!
文章里的内容就这些了。期待对大家的学习和培训有所帮助,也期待大家的应用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)