首页 > 编程语言 >无涯教程-Java NIO - DataGramChannel

无涯教程-Java NIO - DataGramChannel

时间:2023-12-28 23:32:22浏览次数:31  
标签:Java java buffer DataGramChannel 无涯 ByteBuffer import 方法 通道

Java NIO数据报用作通道,可以通过较少连接的协议发送和接收UDP数据包。默认情况下,数据报通道处于阻塞状态,也可以在非阻塞模式下使用。为了使其成为非阻塞状态,无涯教程可以使用configureBlocking( false)方法。可以通过调用名为 open()的静态方法之一来打开DataGram通道,该方法也可以使用IP地址作为参数,以便将其用于多类型转换。

默认情况下,不连接FileChannel的数据报通道以使其连接,必须显式调用其connect()方法,但是不必连接数据报通道以在必须连接时使用send和receive方法为了使用读写方法。

可以通过调用其 isConnected()方法来检查数据报通道的连接状态。

重要函数

  • bind(SocketAddress local)                                   - 此方法用于将数据报绑定到本地地址。

  • connect(SocketAddress remote)                         - 此方法用于将Socket连接到远程地址。

  • disconnect()                                                            - 此方法用于将Socket断开与远程地址的连接。

  • getRemoteAddress()                                             - 此方法返回通道Socket连接到的远程位置的地址。

  • isConnected()                                                         - 该方法返回数据报通道的连接状态,即是否已连接。

  • open()和open(ProtocolFamily family)              - Open方法用于为单个地址打开一个数据报通道,而参数open方法为多个地址的打开通道。 

  • read(ByteBuffer dst)                                             - 此方法用于通过数据报通道从给定的缓冲区读取数据。

  • receive(ByteBuffer dst)                                        - 此方法用于通过此通道接收数据报。

  • send(ByteBuffer src,SocketAddress target)  - 此方法用于通过此通道发送数据报。

以下示例显示了如何从Java NIO DataGramChannel发送数据。

服务端代码

DatagramChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelServer {
   public static void main(String[] args) throws IOException {
      DatagramChannel server = DatagramChannel.open();
      InetSocketAddress iAdd = new InetSocketAddress("localhost", 8989);
      server.bind(iAdd);
      System.out.println("Server Started: " + iAdd);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      //从客户端接收缓冲区。
      SocketAddress remoteAdd = server.receive(buffer);
      //改变缓冲区模式
      buffer.flip();
      int limits = buffer.limit();
      byte bytes[] = new byte[limits];
      buffer.get(bytes, 0, limits);
      String msg = new String(bytes);
      System.out.println("Client at " + remoteAdd + "  sent: " + msg);
      server.send(buffer,remoteAdd);
      server.close();
   }
}

运行上面代码输出

Server Started: localhost/127.0.0.1:8989

客户端代码

DatagramChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelClient {
   public static void main(String[] args) throws IOException {
      DatagramChannel client = null;
      client = DatagramChannel.open();

      client.bind(null);

      String msg = "Hello World!";
      ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
      InetSocketAddress serverAddress = new InetSocketAddress("localhost",
        8989);

      client.send(buffer, serverAddress);
      buffer.clear();
      client.receive(buffer);
      buffer.flip();
    
      client.close();
   }
}

运行客户端将在服务器上打印以下输出。

Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857  sent: Hello World!

参考链接

https://www.learnfk.com/java-nio/java-nio-datagram-channel.html

标签:Java,java,buffer,DataGramChannel,无涯,ByteBuffer,import,方法,通道
From: https://blog.51cto.com/u_14033984/9019393

相关文章

  • Java Spring Boot Mybatis-Plus 的简单使用
    此文主要基于官网case整理,如需了解更多详情,请移步官网。环境:SpringBoot:3.1.6JDK:17MySQL:5.7数据准备主要是MySQL建库建表,插入一些数据。建库:CREATEDATABASEmybatis_demo;建表:DROPTABLEIFEXISTS`user`;CREATETABLE`user`(idBIGINTNOTNULLCOMME......
  • 无涯教程-Java NIO - 简介
    Java1.4中引入了Java.nio包,引入了用于I/O操作的面向缓冲区和通道的数据流,从而提供了更快的执行速度和更好的性能。NIOAPI还提供了selector选择器,该选择器引入了以异步或非阻塞方式侦听IO事件的多个通道的功能。在NIO中,最耗时的I/O任务将缓冲区填充和释放到操作系统中,从而提高......
  • Java虚拟机内存模型概念
    Java虚拟机内存模型概念  Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区methodarea  一、栈stack  1. 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)  2.JVM为每个线程创建一个栈,用于存放该线程执......
  • JAVA学习12-28 数据类型
    数据类型学习publicclassDemo01{publicstaticvoidmain(String[]args){//单行注释/*多行注释*//*不能用关键字来做标识符*//*标识符可以大写字母,小写字母,美元符号,下划线_开头,不能以关键字作为变量名或方法名,-......
  • Java 实现List反转(reverse)的方法
    ​ List的反转是一种常见的操作,反转List会改变列表中元素的顺序,可以根据具体的需求在程序中实现不同的功能和行为。本文主要介绍Java中实现List反转(reverse)的方法,以及相关的示例代码。1、使用for循环实现使用for循环对List进行倒序遍历,添加到一个List中实现反转。代码示......
  • 无涯教程-Java泛型 - 不允许 重载
    一个类不允许具有两个在类型擦除后可以具有相同签名的重载方法。classBox{//Compilererror//Erasureofmethodprint(List<String>)//isthesameasanothermethodintypeBoxpublicvoidprint(List<String>stringList){}publicvoidprint(Li......
  • 无涯教程-Java泛型 - 不允许 数组
    不允许使用参数化类型的数组。//无法创建Box<Integer>的通用数组Box<Integer>[]arrayOfLists=newBox<Integer>[2];由于编译器使用类型擦除,因此将type参数替换为对象,并且用户可以将任何类型的对象添加到数组中。并且在运行时,代码将无法引发ArrayStoreException。//编译......
  • 无涯教程-Java泛型 - 不允许 异常
    泛型类不允许直接或间接扩展Throwable类。//泛型类Box<T>可能不是java.lang.Throwable的子类classBox<T>extendsException{}//泛型类Box<T>可能不是java.lang.Throwable的子类classBox1<T>extendsThrowable{}不允许方法捕获类型参数的。publicstatic<T......
  • JAVA基础+安装
    Java特性高效可跨平台不占内存不需要指针Java三大版本Writeonce,runanywhere.JavaSE:标准版(桌面程序,控制台开发……)JavaME:嵌入式开发(手机,小家电……)JavaEE:E企业级开发(web端,服务器开发)JDK、JRE、JVMJDK:JavaDevelopmentKitJava开发者工具JRE:JavaRuntimeEnvi......
  • javaCC链2
    cc2链pom.xml配置<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version></dependency>......