首页 > 开发 > Java > 正文

Java NIO实例UDP发送接收数据代码分享

2024-07-13 10:14:10
字体:
来源:转载
供稿:网友

Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel,UDP是一种无连接的网络协议,
一般用于发送一些准确度要求不太高的数据等。

完整的服务端程序如下:

java/259053.html">javascript/83550.html">java;">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();

总结

以上就是本文关于Java NIO实例UDP发送接收数据代码分享的全部内容,希望对大家有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表