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

Comment implémenter le client SocketChannel en Java

王林
王林avant
2023-04-17 22:28:011505parcourir

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();
            }
        }
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer