Java NIO - Canal de socket

Le canal de socket Java NIO est un canal de type sélectionnable, ce qui signifie qu'il peut être multiplexé à l'aide du sélecteur, utilisé pour les sockets de connexion de flux de données orientés flux. open() , à condition qu'aucune socket préexistante ne soit déjà présente.Le canal de socket est créé en appelant la méthode ouverte mais pas encore connecté.Afin de connecter le canal de socket connect() Un point à mentionner ici est que si le canal n'est pas connecté et qu'une opération d'E / S est tentée, alors NotYetConnectedException est levée par ce canal.Il faut donc s'assurer que le canal est connecté avant d'effectuer toute IO Une fois le canal connecté, il reste connecté jusqu'à ce qu'il soit fermé. L'état du canal socket peut être déterminé en invoquant son isConnected méthode.

La connexion du canal de socket peut être terminée en invoquant son finishConnect() Le fait qu'une opération de connexion soit en cours ou non peut être déterminé en appelant la méthode isConnectionPending.Par défaut, le canal de socket prend en charge la connexion non bloquante.Il prend également en charge l'arrêt asynchrone, qui est similaire à l'opération de fermeture asynchrone spécifiée dans la classe Channel.

Les canaux de socket sont sûrs pour une utilisation par plusieurs threads simultanés. Ils prennent en charge la lecture et l'écriture simultanées, bien qu'au plus un thread puisse être en lecture et au plus un thread puisse écrire à un moment donné. Les méthodes connect et finishConnect sont mutuellement synchronisées les unes par rapport aux autres, et une tentative d'initier une opération de lecture ou d'écriture alors qu'un appel de l'une de ces méthodes est en cours bloquera jusqu'à ce que cet appel soit terminé.

Méthodes importantes de canal de socket

  • bind(SocketAddress local) - Cette méthode est utilisée pour lier le canal de socket à l'adresse locale qui est fournie comme paramètre de cette méthode.

  • connect(SocketAddress remote) - Cette méthode est utilisée pour connecter la prise à l'adresse distante.

  • finishConnect() - Cette méthode est utilisée pour terminer le processus de connexion d'un canal de socket.

  • getRemoteAddress() - Cette méthode renvoie l'adresse de l'emplacement distant auquel la prise du canal est connectée.

  • isConnected() - Comme déjà mentionné cette méthode retourne l'état de connexion du canal de socket c'est à dire s'il est connecté ou non.

  • open() and open((SocketAddress remote) - La méthode ouverte est utilisée pour ouvrir un canal de socket pour aucune adresse spécifiée tandis que la méthode ouverte paramétrée ouvre le canal pour l'adresse distante spécifiée et s'y connecte également.Cette méthode pratique fonctionne comme en invoquant la méthode open (), en invoquant la méthode de connexion sur le résultat socket channel, en le passant à distance, puis en renvoyant ce canal.

  • read(ByteBuffer dst) - Cette méthode est utilisée pour lire les données du tampon donné via le canal socket.

  • isConnectionPending() - Cette méthode indique si une opération de connexion est en cours ou non sur ce canal.

Exemple

L'exemple suivant montre comment envoyer des données à partir de Java NIO SocketChannel.

C: /Test/temp.txt

Hello World!

Client: SocketChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;

public class SocketChannelClient {
   public static void main(String[] args) throws IOException {
      ServerSocketChannel serverSocket = null;
      SocketChannel client = null;
      serverSocket = ServerSocketChannel.open();
      serverSocket.socket().bind(new InetSocketAddress(9000));
      client = serverSocket.accept();
      System.out.println("Connection Set:  " + client.getRemoteAddress());
      Path path = Paths.get("C:/Test/temp1.txt");
      FileChannel fileChannel = FileChannel.open(path, 
         EnumSet.of(StandardOpenOption.CREATE, 
            StandardOpenOption.TRUNCATE_EXISTING,
            StandardOpenOption.WRITE)
         );      
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(client.read(buffer) > 0) {
         buffer.flip();
         fileChannel.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Received");
      client.close();
   }
}

Production

L'exécution du client n'imprimera rien avant le démarrage du serveur.

Serveur: SocketChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;

public class SocketChannelServer {
   public static void main(String[] args) throws IOException {
      SocketChannel server = SocketChannel.open();
      SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
      server.connect(socketAddr);

      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(fileChannel.read(buffer) > 0) {
         buffer.flip();
         server.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Sent");
      server.close();
   }
}

Production

L'exécution du serveur imprimera ce qui suit.

Connection Set:  /127.0.0.1:49558
File Received