mysql连接 udp_UDP连接对象原理解析及使用实例

本文解析了UDP连接对象DatagramSocket的工作原理,并通过一个MySQL连接的示例展示了其创建与使用。重点指出UDP的无状态特性,强调DatagramSocket只需创建一次。文中提供了一个UDP客户端示例,演示了发送与接收数据的过程,以及在接收数据时可能出现的SocketTimeoutException。建议在实际应用中,初始化连接对象并进行异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写了一个简单的UDP服务端和客户端示例,用于入门UDP,当我实际使用时发生了一点问题!

上次使用中我也把连接对象 DatagramSocket 写成了静态的,在类的初始化时使用,可是系统中有很多地方使用,难道我要不断的创建这个类的对象吗?

可以这么做,当时有后果,后果就是内存溢出。

UDP是没有状态的,DatagramSocket 创建一次即可,就是开始指向某个地址的端口,而不用每次创建。

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

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

package udp;

import java.net.*;

/**

* @说明 UDP客户端程序,用于对服务端发送数据,并接收服务端的回应信息

* @author cuisuqiang

* @version 1.0

* @since cuisuqiang@163.com

*/

public class UdpClientSocket {

/**

* 连接对象

*/

private static DatagramSocket ds = null;

/**

* 地址对象

*/

private static SocketAddress address = null;

/**

* 测试客户端发包和接收回应信息的方法

*/

public static void main(String[] args) throws Exception {

init();

while(true){

UdpClientSocket.send(address,"你好,亲爱的!".getBytes());

UdpClientSocket.receive();

try {

Thread.sleep(3 * 1000);

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 对连接和地址初始化

*/

public static void init(){

try {

ds = new DatagramSocket(8899); // 邦定本地端口作为客户端

ds.setSoTimeout(2 * 1000);

address = new InetSocketAddress("127.0.0.1",3344);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 向指定的服务端发送数据信息

*/

public static void send(SocketAddress address,byte[] bytes){

try {

DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address);

ds.send(dp);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 接收从指定的服务端发回的数据

*/

public static void receive(){

try {

byte[] buffer = new byte[1024];

DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

ds.receive(dp);

byte[] data = new byte[dp.getLength()];

System.arraycopy(dp.getData(), 0, data, 0, dp.getLength());

System.out.println("服务端回应数据:" + new String(data));

} catch (Exception e) {

e.printStackTrace();

}

}

}

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

java.net.SocketTimeoutException: Receive timed out

at java.net.PlainDatagramSocketImpl.receive0(Native Method)

at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)

at java.net.DatagramSocket.receive(DatagramSocket.java:712)

at udp.UdpClientSocket.receive(UdpClientSocket.java:69)

at udp.UdpClientSocket.main(UdpClientSocket.java:28)

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

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

运行后客户端可以正常发送和接收数据!

如果在实际运用中,我是设置一个系统启动项,来初始化 init 连接对象和地址,具体使用时进行异常捕获就可以了!

如果你的连接对象每次创建,且使用频繁,一般几分钟系统即可搞挂!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值