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
0
投稿

猜你喜欢

  • Java实现文件分割和文件合并实例

    2022-12-15 17:18:35
  • Java 继承与多态的深入理解

    2023-10-05 04:25:41
  • Maven中央仓库地址配置大全

    2022-06-14 02:42:48
  • Android 使用Picasso加载网络图片等比例缩放的实现方法

    2023-08-29 15:36:32
  • 使用TypeScript开发微信小程序的方法

    2023-08-30 10:42:03
  • 计算字符串和文件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
  • 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
  • Windows窗体的.Net框架绘图技术实现方法

    2022-06-29 13:32:23
  • C# 打开电子邮件软件的具体方法

    2022-07-02 10:53:07
  • C# WebApi 路由机制剖析

    2022-01-23 05:20:16
  • Android Studio 运行按钮灰色的完美解决方法

    2023-08-16 05:59:42
  • C# 利用Selenium实现浏览器自动化操作的示例代码

    2023-08-10 23:43:15
  • 使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    2023-11-12 19:25:55
  • c#操作Redis的5种基本类型汇总

    2021-06-03 03:24:07
  • asp之家 软件编程 m.aspxhome.com