Maison >Java >javaDidacticiel >Comment implémenter le client SocketChannel en Java
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!