Java NIO实例UDP发送接收数据代码分享
作者:在远行的路上 时间:2022-12-03 01:30:37
Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel,UDP是一种无连接的网络协议,
一般用于发送一些准确度要求不太高的数据等。
完整的服务端程序如下:
public class StatisticsServer {
//每次发送接收的数据包大小
private final int MAX_BUFF_SIZE = 1024 * 10;
//服务端监听端口,客户端也通过该端口发送数据
private int port;
private DatagramChannel channel;
private Selector selector;
private ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
public void init() throws IOException {
//创建通道和选择器
selector = Selector.open();
channel = DatagramChannel.open();
//设置为非阻塞模式
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(port));
//将通道注册至selector,监听只读消息(此时服务端只能读数据,无法写数据)
channel.register(selector, SelectionKey.OP_READ);
//使用线程的方式,保证服务端持续等待接收客户端数据
es.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
while(selector.select() > 0) {
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while(iterator.hasNext()) {
SelectionKey key = iterator.next();
try {
iterator.remove();
if(key.isReadable()) {
//接收数据
doReceive(key);
}
} catch (Exception e) {
logger.error("SelectionKey receive exception", e);
try {
if (key != null) {
key.cancel();
key.channel().close();
}
} catch (ClosedChannelException cex) {
logger.error("Close channel exception", cex);
}
}
}
}
} catch (IOException e) {
logger.error("selector.select exception", e);
}
}
}, 0L, 2L, TimeUnit.MINUTES);
}
//处理接收到的数据
private void doReceive(SelectionKey key) throws IOException {
String content = "";
DatagramChannel sc = (DatagramChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(MAX_BUFF_SIZE);
buffer.clear();
sc.receive(buffer);
buffer.flip();
while(buffer.hasRemaining()) {
byte[] buf = new byte[buffer.limit()];
buffer.get(buf);
content += new String(buf);
}
buffer.clear();
logger.debug("receive content="+content);
if(StringUtils.isNotBlank(content)) {
doSave(content);
}
}
}
客户端发送完整例子如下:
DatagramChannel channel = DatagramChannel.open();
StringBuilder sb = new StringBuilder();
sb.append("2017-03-09 12:30:00;")
.append("aaa")
.append("testapp;")
.append("test.do;")
.append("param=hello;")
.append("test;")
.append("100;")
.append("1");
ByteBuffer buffer = ByteBuffer.allocate(10240);
buffer.clear();
buffer.put(sb.toString().getBytes());
buffer.flip();
//此处IP为服务端IP地址,端口和服务端的端口一致
int n = channel.send(buffer, new InetSocketAddress("127.0.0.1", 8080));
System.out.println(n);
//每次数据发送完毕之后,一定要调用close方法,来关闭占用的udp端口,否则程序不结束,端口不会释放
channel.close();
总结
Rxjava功能操作符的使用方法详解
分享一个简单的java爬虫框架
Javaweb应用使用限流处理大量的并发请求详解
有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!
来源:http://blog.csdn.net/lzy_lizhiyang/article/details/61914581
标签:java,nio,udp
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java实现文件分割和文件合并实例
2022-12-15 17:18:35
![](https://img.aspxhome.com/file/2023/5/79865_0s.png)
Java 继承与多态的深入理解
2023-10-05 04:25:41
Maven中央仓库地址配置大全
2022-06-14 02:42:48
![](https://img.aspxhome.com/file/2023/8/86038_0s.jpg)
Android 使用Picasso加载网络图片等比例缩放的实现方法
2023-08-29 15:36:32
使用TypeScript开发微信小程序的方法
2023-08-30 10:42:03
![](https://img.aspxhome.com/file/2023/5/106445_0s.png)
计算字符串和文件MD5值的小例子
2023-12-10 20:31:19
Android获取手机的版本号等信息的代码
2021-09-21 06:00:26
IDEA与模拟器安装调试失败的处理方法:INSTALL_PARSE_FAILED_NO_CERTIFICATES
2022-08-25 13:57:53
![](https://img.aspxhome.com/file/2023/2/75462_0s.png)
Mybatis拦 截 器实现数据权限的示例代码
2023-11-19 20:15:04
详解Spring的StringUtils踩坑记录
2021-08-23 16:14:39
Android评分控件RatingBar使用实例解析
2022-02-07 14:17:03
C#中缓存的基本用法总结
2023-12-06 01:22:45
Spring Boot 实现图片上传并回显功能
2021-10-11 17:45:20
![](https://img.aspxhome.com/file/2023/6/68776_0s.png)
Windows窗体的.Net框架绘图技术实现方法
2022-06-29 13:32:23
C# 打开电子邮件软件的具体方法
2022-07-02 10:53:07
C# WebApi 路由机制剖析
2022-01-23 05:20:16
![](https://img.aspxhome.com/file/2023/4/111184_0s.png)
Android Studio 运行按钮灰色的完美解决方法
2023-08-16 05:59:42
![](https://img.aspxhome.com/file/2023/4/89534_0s.png)
C# 利用Selenium实现浏览器自动化操作的示例代码
2023-08-10 23:43:15
![](https://img.aspxhome.com/file/2023/1/76431_0s.png)
使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)
2023-11-12 19:25:55
![](https://img.aspxhome.com/file/2023/6/59606_0s.png)
c#操作Redis的5种基本类型汇总
2021-06-03 03:24:07
![](https://img.aspxhome.com/file/2023/7/89807_0s.png)