Java NIO (E/S sin bloqueo) con ejemplo de servidor-cliente: java.nio.ByteBuffer y canales. Selector: Java NIO vs. io

Publicado: 2021-08-06
Java NIO (E/S sin bloqueo) con ejemplo de servidor-cliente - CrunchifyNIOServer.java

Java NIO es mi tema favorito. He estado trabajando con NIO desde los últimos 2 años y me gustaría compartir un Server-Client code simple para mis lectores que pueden usar este código en su entorno de producción.

A partir de JDK 1.4, NIO se creó para permitir que todos los programadores de Java implementen entradas/salidas de muy alta velocidad sin tener que lidiar con código nativo personalizado. NIO usa la biblioteca java.nio.buffer en comparación con E/S simple que drena y llena el búfer internamente en cualquier sistema operativo.

En este tutorial repasaremos las bibliotecas java.nio.channels y java.nio.channels.Selector .

  • channels representan conexiones a entidades que son capaces de realizar operaciones de E/S, como archivos y sockets; define selectores , para operaciones de E/S multiplexadas y sin bloqueo.
  • El selector se puede crear invocando el open method de esta clase, que utilizará el proveedor de selector predeterminado del sistema para crear un nuevo selector.
Explicación del paquete java.nio con detalles de la API

Si tiene las below questions , entonces está en el lugar correcto:

  • Cómo empezar con Java NIO
  • Qué es Java NIO y Tutoriales de Java NIO
  • Java NIO asíncrono
  • ¿Cuál es el uso exacto del paquete java nio?
  • Tutorial Java NIO
  • Cómo implementar E/S de alto rendimiento con Java NIO

Empecemos:

Paso 1

  • Cree CrunchifyNIOServer.java que abre la conexión en el port 1111
  • use isAcceptable() para verificar si el canal está listo para aceptar una nueva conexión de socket
    • Si es así, conéctelo
  • use isReadable() para verificar si el canal está listo para leer
    • en caso afirmativo, lea del búfer e imprima en la consola de Eclipse
  • Una vez que obtenga el apellido de la empresa "crunchify"
    • conexión cercana

Paso 2

  • Cree CrunchifyNIOClient.java que intenta conectarse al servidor en el port 1111
  • Crear ArrayList con 5 nombres de empresas
  • Iterar a través de ArrayList y enviar cada nombre de empresa al servidor
  • Cerrar conexión después de finalizar la tarea

Echa un vistazo a este código Java:

Código del servidor: CrunchifyNIOServer.java


Código de cliente – CrunchifyNIOClient.java

Java NIO (E/S sin bloqueo) con ejemplo de servidor-cliente - CrunchifyNIOClient.java

Resultado en el lado del servidor:

Resultado en el lado del cliente:


Algunas preguntas frecuentes:

  1. Desde el cliente, ¿cómo mantengo una conexión persistente?
    • Podrías usar socket.setKeepAlive(true); tener conexiones vivas desde el lado del cliente.
  2. ¿Cómo leo una respuesta al mensaje que envío al servidor? El servidor sigue generando mensajes cada 10 segundos. Solo necesito leer la respuesta a mi solicitud. Por lo que entiendo, TCP "transmite" datos en lugar de fin de registro, etc.
    • Para la comunicación entre el servidor y el cliente, es necesario definir bien un protocolo. La llamada readLine() se bloqueará hasta que se devuelvan todos los datos, así que no la use. Try reading bytes from the stream until -1 is returned.

Déjame saber si eso funciona.