介绍
本篇文章给大家分享的是有关使用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连接对象原理