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); } } }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java 中防止接口重复提交的方法有哪些?(java接口防止重复提交的方法是什么)
- 如何提高 Java Office 的性能?(java office 怎样提高性能 )
- Java 抽象工厂模式的优缺点有哪些?(java抽象工厂模式有哪些优缺点)
- 在 Java 中,charsequence 的具体用法究竟是什么?(java中charsequence的用法是什么)
- 如何利用 Java Quarter 进行数据挖掘?(java quarter如何进行数据挖掘)
- Java 中常见的比较操作符有哪些?(Java比较操作符有哪些)
- 在 Java 中,Integer 究竟有哪些作用呢?(java中integer的作用是什么)
- Java 实体类如何进行赋值操作?(java实体类怎么赋值)
- Java 中 switch case 的具体用法有哪些?(switchcase在java中的用法)
- 如何在 Java EMqtt 中实现消息确认机制?(Java EMqtt怎样实现消息确认机制)
猜你喜欢
AI推送时光机Java NIO实例UDP发送接收数据代码分享
后端开发2023-05-30
Java发送报文与接收报文的实例代码
后端开发2024-04-02
咦!没有更多了?去看看其它编程学习网 内容吧