Java NIO实例UDP发送接收数据代码分享
作者:在远行的路上 发布时间:2022-12-03 01:30:37
标签:java,nio,udp
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批量解析微信dat文件的具体代码,供大家参考,具体内容如下微信图片默认路径:C:\Users\b-eet\Doc
- 1、unity的脚本模板新版本unity中的C#脚本有三类,第一类是我们平时开发用的C# Script;第二类是Testing,用来做单元测
- ProgressBar进度条,分为旋转进度条和水平进度条,进度条的样式根据需要自定义,之前一直不明白进度条如何在实际项目中使用,网上演示进度
- Android application捕获崩溃异常怎么办?通用 application1、收集所有 avtivity 用于彻底退出应用2、捕
- List映射表List列表是一个java集合存储在序列中的元素,并允许重复的元素。此接口的用户可以精确地控制,其中列表中的每个元素插入。用户
- 说明本文主要配置Jackson对Long、Date、LocalDate、LocalDateTime的序列化和反序列化。由于js中整数可精确表
- 在java开发的实际场景中,我们经常要对时间进行格式化处理,但是每次获取开发中自己需要的格式都要重新写一个方法,这样的代码看起来是非常的笨重
- 本文实例讲述了C#实现的文件操作封装类。分享给大家供大家参考,具体如下:最近发现群共享里面有个C# 文件操作封装类,其方法是调用Window
- 泛型List<T>中有一个比较列表是否已包含对象的方法Contains<T>(),今天在网上搜了一个用法,记录下来,
- 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇总结java从
- 包括系统钩子和线程钩子,或者叫全局钩子和私有钩子。系统钩子需要一个单独的DLL,这个地方耽误了不少时间,网上有说可以不用单独DLL的。 现在
- SpringBoot默认加载的是application.yml文件,所以想要引入其他配置的yml文件,就要在application.yml中
- 本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下项目名称寻找迷宫出路项目描述给定一个自定义迷宫,0表示能通过
- 1.返回String“长度”方法你如何确定给定String的长度?java提供了一种称为“length()”的方法。将它用于您需要查找Str
- 一、Surface 概述OpenGL ES/Skia定义了一组绘制接口的规范,为什么能够跨平台? 本质上需要与对应平台上的本地窗口建立连接。
- mkdir函数用于创建目录。格式如下:#include<sys/types.h>#include<sys/stat.h&g
- 前言在学习android中图形图像处理技术这部分内容时,对绘制圆弧函数canvas.drawArc()的用法、参数含义及画图原理很是不理解,
- 本文实例讲述了android编程实现悬浮窗体的方法。分享给大家供大家参考,具体如下:突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击
- 1、实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志。2、配置:FILE是ERROR级别日志打印
- 本地仓库主要是一种缓存,当你使用远程仓库中下载组件后,它下一次会优先从本地进行加载,一般位于USER_HOME/.m2目录下,我们自己也可以