1. Langkah
(1) Buat contoh SocketChannel dan konfigurasikannya dalam mod bukan sekatan Hanya dalam contoh SocketChannel, sebarang operasi I/O tidak menyekat.
(2) Gunakan kaedah connect() untuk menyambung ke pelayan dan gunakan gelung sementara untuk mengesan dan melengkapkan sambungan secara berterusan. Anda mesti menggunakan finishConnect() untuk melengkapkan proses sambungan sebelum operasi I/O segera diperlukan.
(3) Gunakan ByteBuffer untuk membaca dan menulis bait Jika SelectableChannel berada dalam mod tidak menyekat, maka operasi I/Onya mungkin membaca dan menulis lebih sedikit bait daripada bait sebenar, atau bahkan tiada. Oleh itu, kami menggunakan pembacaan dan penulisan berterusan dalam satu gelung untuk memastikan pembacaan dan penulisan selesai.
2. Contoh
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(); } } } }
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan klien SocketChannel dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!