Maison > Java > javaDidacticiel > Comment implémenter le client SocketChannel en Java

Comment implémenter le client SocketChannel en Java

王林
Libérer: 2023-04-17 22:28:01
avant
1560 Les gens l'ont consulté

1. Étape

(1) Créez une instance SocketChannel et configurez-la en mode non bloquant Uniquement dans l'instance SocketChannel, toutes les opérations d'E/S sont non bloquantes.

(2) Utilisez la méthode connect() pour vous connecter au serveur et utilisez une boucle while pour détecter et terminer la connexion en continu. Vous devez utiliser finishConnect() pour terminer le processus de connexion avant que des opérations d'E/S immédiates ne soient requises.

(3) Utilisez ByteBuffer pour lire et écrire des octets. Si SelectableChannel est dans un mode non bloquant, alors son opération d'E/S peut lire et écrire moins d'octets que les octets réels, voire aucun. Par conséquent, nous utilisons la lecture et l’écriture continues en boucle pour garantir que la lecture et l’écriture sont terminées.

2. Exemple

public class NonBlockingTCPClient {
    public static void main(String[] args) {
        byte[] data = "hello".getBytes();
        SocketChannel channel = null;
        try {
            // 1. open a socket channel
            channel = SocketChannel.open();
            // adjust to be nonblocking
            channel.configureBlocking(false);
            // 2. init connection to server and repeatedly poll with complete
            // connect() and finishConnect() are nonblocking operation, both return immediately
            if (!channel.connect(new InetSocketAddress(InetAddress.getLocalHost(), 8899))) {
                while (!channel.finishConnect()) {
                    System.out.print(".");
                }
            }
 
            System.out.println("Connected to server...");
 
            ByteBuffer writeBuffer = ByteBuffer.wrap(data);
            ByteBuffer readBuffer = ByteBuffer.allocate(data.length);
            int totalBytesReceived = 0;
            int bytesReceived;
            // 3. read and write bytes
            while (totalBytesReceived < data.length) {
                if (writeBuffer.hasRemaining()) {
                    channel.write(writeBuffer);
                }
                if ((bytesReceived = channel.read(readBuffer)) == -1) {
                    throw new SocketException("Connection closed prematurely");
                }
                totalBytesReceived += bytesReceived;
                System.out.print(".");
            }
            System.out.println("Server said: " + new String(readBuffer.array()));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4 .close socket channel
            try {
                if (channel != null) {
                    channel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal