当前位置: 首页 > news >正文

java NIO实现UDP通讯

NIO Udp通讯工具类

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;import lombok.extern.slf4j.Slf4j;/*** NIO Udp工具类*/
@Slf4j
public class MyUdpSocket {//获取报文的通道private DatagramChannel channel;//多路复用选择器private Selector selector;private final int MAX_SIZE = 1280;//当前获取到版本的端口private int client_port;//记录当前获取到报文的ipprivate String client_ip;ByteBuffer receive_buffer = ByteBuffer.allocate(MAX_SIZE);public MyUdpSocket(String ip, int port) throws IOException {channel=DatagramChannel.open();selector=Selector.open();try{//调整此通道为非阻塞模式  channel.configureBlocking(false);  //获取与套接字通道关联的套接字,并将该套接字绑定到本机指定端口  channel.socket().bind(new InetSocketAddress(port));//为通道选择器注册通道,并指定操作的选择键集  channel.register(selector, SelectionKey.OP_READ);  }catch (IOException e) {log.error("MyUdpSocket init error", e);}}/*** 接收数据* @return*/public final int receive() {try{receive_buffer.clear();if(selector.select(1000)!=0) {Iterator<SelectionKey> itr = selector.selectedKeys().iterator();while(itr.hasNext()){  SelectionKey key = itr.next( );itr.remove(); if(key.isReadable()){DatagramChannel dc = (DatagramChannel)key.channel();  InetSocketAddress client = (InetSocketAddress)dc.receive(receive_buffer); //接收来自任意一个Client的数据报if (client!=null) {client_ip=client.getAddress().getHostAddress();client_port=client.getPort();//System.out.println(client_ip+":"+client_port+" size="+receive_buffer.position());key.interestOps(SelectionKey.OP_READ);return receive_buffer.position();} else {return 0;}} else {return 0;}}}}catch (IOException e) {log.error(String.format("udp_receive出错:%s", e.getMessage()), e);}return 0;}public final void close() throws IOException {selector.close();channel.close();}public final int get_client_port(){return client_port;}public final String get_client_ip(){return client_ip;}public final byte[] get_receive_packet(int size){byte[] packet = new byte[size];for (int i=0; i<size; i++){packet[i]=receive_buffer.array()[i];}return packet;}public final void get_receive_buffer(byte[] buffer){receive_buffer.get(buffer);}
}

用法:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class UdpSocketTest {public static void main(String[] args) throws IOException {MyUdpSocket socket = new MyUdpSocket("127.0.0.1", 1234);while(true) {int size = socket.receive();if (size>0) {byte[] data = socket.get_receive_packet(size);System.out.println("ip:" + socket.get_client_ip());DatagramPacket packet = new DatagramPacket(data, 0, data.length);packet.setSocketAddress(new InetSocketAddress(socket.get_client_ip(), socket.get_client_port()));DatagramSocket datagramSocket = new DatagramSocket(null);datagramSocket.setReuseAddress(true);datagramSocket.send(packet);datagramSocket.close();}}}
}

http://www.lryc.cn/news/451553.html

相关文章:

  • ffmpeg如何实现视频推流?
  • 【HTML5】html5开篇基础(3)
  • echarts实现3D柱状图(视觉层面)根据博主改编
  • 【一篇文章理解Java中多级缓存的设计与实现】
  • OpenSource - 开源WAF_SamWaf
  • 旅游避坑指南
  • 矩阵系统源码搭建的具体步骤,支持oem,源码搭建
  • 正则表达式调试工具实战
  • SQL:函数以及约束
  • 在Linux中将设备驱动的地址映射到用户空间
  • 电脑自带dll修复在哪里,dll丢失的6种解决方法总结
  • k8s基于nfs创建storageClass
  • Chrome无法拖入加载.crx扩展文件(以IDM为例)
  • 数字教学时代:构建高效在线帮助中心的重要性
  • 828华为云征文|华为云弹性云服务器FlexusX实例下的Nginx性能测试
  • 知识图谱入门——2:技术体系基本概念:知识表示与建模、知识抽取与挖掘、知识存储与融合、知识推理与检索
  • 【不看会后悔系列】排序之——文件归并【史上最全详解】~
  • 安全点的应用场景及其原理详解
  • 计算机各专业2025毕业设计选题推荐【各专业 | 最新】
  • 【Python报错已解决】IndexError: index 0 is out of bounds for axis 1 with size 0
  • SpringGateway(网关)微服务
  • jQuery面试题:(第三天)
  • 聊聊国内首台重大技术装备(2)
  • python 实现rayleigh quotient瑞利商算法
  • Java Web应用升级故障案例解析
  • Java类和对象、自定义包、static、代码块、方法重写
  • 【系统代码】招投标采购一体化管理系统,JAVA+vue
  • 基于yolov8深度学习的120种犬类检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面目标检测狗类检测犬类识别系统
  • UNI-APP_iOS开发技巧之:跳转到TestFlight或者App Store
  • 基于SSM+Vue技术的定制式音乐资讯平台